Тут выложили обзор фич C# 9, и там очень много ФП и странного синтаксиса (привет WitcherGeralt).


Sum Types:


enum class MixedType  
{
Person P;
ByteOrBool U;
}

var person = new Person()
{
Firstname = "Bassam";
Lastname = "Alugili";
};

var unionRecord = new MixedType.P(person);
var unionType1 = new MixedType.U(B true);
var unionType2 = new MixedType.U(Y 86uy);


Pattern matching:


public class GenericClass<T> where T : T1 | T2 | T3 

var crazyCollectionFP = new List<int|double|string>{1, 2.3, "bassam"};

var result = x switch { true => "Successful", false => 0 };


Типы аля Rust:


public class None {}  
public typealias Option<T> = T | None;
public typealias Result<T> = T | Exception;


Некое чудо-юдо для автоматической проверки на null:


void M(List<int> list, uint? u)  
{
IEnumerable<int> x = list ?? new[] { 1, 2 };
var l = u ?? -1;
}


Что значит uint? - без понятия.


Проверка аргумента на null:


void DoSomething (string txt!)  
{

}


Lambda discard parameters (хз как перевести):


Func zero = (_,_) => 0;  
(_,_) => 1, (int, string) => 1, void local(int , int);


Атрибуты аргументов (опять как в rust):


static bool LocalFunc([NotNull] data)  
{
return true;
}


Нативный int:


nint nativeInt = 55; // take 4 bytes when I compile in 32 Bit host.  
nint nativeInt = 55; // take 8 bytes when I compile in 64 Bit host with x64 compilation settings.

nuint nativeUnsignedInt = 55;


А eao197 говорил, что u32 - это дно. Оказывается нет.


Указатели на функцию (неужели до этого не было?):


unsafe class Example  
{
void Example(Action<int> a, delegate*<int, void> f)
{
a(42);
f(42);
}
}




В целом радует, что идут в сторону ФП и null-safety, но в итоге получаем второй C++, в котором на любой чих есть с десяток конструкций. Что в конечном итоге убивает экосистему.









 , ,






URL записи