Start Debugging
2026-01-02 Обновлено 2026-01-04 csharpcsharp-proposals Edit on GitHub

Предложение C#: дискриминированные объединения

Обзор предложения о дискриминированных объединениях в C#: ключевое слово union, исчерпывающее сопоставление с образцом и как оно может заменить библиотеки OneOf и иерархии классов.

“Святой Грааль” возможностей C# обсуждается уже много лет. И после долгих лет, в которые мы полагались на сторонние библиотеки вроде OneOf или громоздкие иерархии классов, похоже, мы наконец получим встроенную поддержку дискриминированных объединений (DU) в одной из будущих версий C#.

Проблема: представить “одно из”

Если вам нужна была функция, возвращающая либо обобщённый результат Success, либо конкретный Error, выбор был неудачным:

  1. Бросать исключения (дорого для управления потоком).
  2. Возвращать object (потеря типобезопасности).
  3. Использовать иерархию классов (громоздко и допускает других наследников).

Решение: типы 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.

< Назад