Discriminated Unions в C##программирование
@yet_another_devСегодня про Discriminated Unions (DU) в C#, который вроде как должен появиться в .NET 11. Этот функционал уже доступен в Preview-версии SDK – можете
установить и попробовать сами. Я попробовал и вот что я вам скажу.
1. Выглядит прикольно. Можно объединять типы.
var value = Random.Shared.Next() % 2 == 0 ?
new IsNumberOrString(int.MaxValue) :
new IsNumberOrString("Hello, World!");
var result = value switch
{
int x => $"Number: {x}",
string y => $"String: {y}",
};
Console.WriteLine(result);
public union IsNumberOrString(int, string);
2. Это синтаксический сахар. Под капотом у DU находятся структуры со всеми их типичными свойствами.
3. При компиляции структура реализует интерфейс IUnion.
public struct IsNumberOrString : IUnion
{
private readonly object k__BackingField;
public readonly object Value => this.k__BackingField;
public IsNumberOrString(int value)
{
this.k__BackingField = (object) value;
}
public IsNumberOrString(string value)
{
this.k__BackingField = (object) value;
}
}
4. Поскольку это обычная структура, то можно делать объединения объединений.
public union SmallNumbers(short, ushort);
public union BigNumbers(long, ulong);
public union Numbers(SmallNumbers, BigNumbers);
5. Я пока не знаю зачем этот функционал нужен и где бы лично я смог его применить. Возможно, он улучшит читаемость кода там, где разработчики применяют функциональный подход к написанию кода и
Railway Oriented Programming. Плюс можно будет выкинуть на свалку все 3rd-party библиотеки, которые пытались реализовать тип
Option/Maybe.
6. Ждите теперь больше дурацких вопросов на собеседованиях про типы и полиморфизм.
Пишите свои мысли в комментариях об этом синтаксисе.