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