Тут выложили обзор фич 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++, в котором на любой чих есть с десяток конструкций. Что в конечном итоге убивает экосистему.








