Предложение C#: дискриминированные объединения
Обзор предложения о дискриминированных объединениях в C#: ключевое слово union, исчерпывающее сопоставление с образцом и как оно может заменить библиотеки OneOf и иерархии классов.
“Святой Грааль” возможностей C# обсуждается уже много лет. И после долгих лет, в которые мы полагались на сторонние библиотеки вроде OneOf или громоздкие иерархии классов, похоже, мы наконец получим встроенную поддержку дискриминированных объединений (DU) в одной из будущих версий C#.
Проблема: представить “одно из”
Если вам нужна была функция, возвращающая либо обобщённый результат Success, либо конкретный Error, выбор был неудачным:
- Бросать исключения (дорого для управления потоком).
- Возвращать
object(потеря типобезопасности). - Использовать иерархию классов (громоздко и допускает других наследников).
Решение: типы union
В предложении вводится ключевое слово union, позволяющее определять закрытые иерархии типов, в которых компилятору известен каждый возможный случай.
// Define a union
public union Result<T>
{
Success(T Value),
Error(string Message, int Code)
}
Под капотом это формирует высокооптимизированную раскладку структуры, аналогично тому, как работают enum в Rust.
Исчерпывающее сопоставление с образцом
Настоящая мощь DU проявляется при их использовании. Выражение switch должно быть исчерпывающим. Если вы забудете случай, код не скомпилируется.
public string HandleResult(Result<int> result) => result switch
{
Result.Success(var val) => $"Got value: {val}",
Result.Error(var msg, _) => $"Failed: {msg}",
// Compiler Error: No default case needed, but all cases must be covered!
};
Почему это важно
Если предложение примут, оно фундаментально изменит обработку ошибок в .NET. Можно будет точно моделировать состояния домена (например, Loading, Loaded, Error) без затрат среды выполнения на выделение классов и без когнитивной нагрузки сложных шаблонов visitor.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.