До сих пор в C# не было встроенного способа описать тип «либо одно, либо другое». Приходилось использовать наследование, object или сторонние библиотеки вроде OneOf.
В .NET 11 Preview появилась экспериментальная возможность — union.
public record class Dog(string Name);
public record class Cat(int Lives);
public union Pet(Dog, Cat);
static string Describe(Pet pet) => pet switch
{
Dog(var name) => $"dog: {name}",
Cat(var lives) => $"cat: {lives}"
};
Что это даёт:
✅ один тип может хранить одно из нескольких значений
✅ компилятор знает все возможные варианты
✅ switch проверяется на полноту
✅ меньше шаблонного кода и проверок типов в рантайме
Рядом появилась и поддержка закрытых иерархий (closed), которая позволяет компилятору анализировать всех наследников типа и также проверять исчерпывающее сопоставление с образцом.
❕ Пока это preview-функциональность. До релиза .NET 11 синтаксис и детали реализации ещё могут измениться.
Идею union types сообщество просило больше десяти лет. Если фича дойдёт до релиза без серьёзных изменений, моделировать состояния, результаты операций и альтернативные типы станет заметно проще.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#async_news