Вы ищете Discriminated Unions
, которая является языковой особенностью F #, но вы можете добиться аналогичного эффекта, используя созданную мной библиотеку, которая называется OneOf
https://github.com/mcintyre321/OneOf
Основное преимущество перед switch
(и if
и exceptions as control flow
) заключается в том, что он безопасен во время компиляции - нет обработчика по умолчанию или сбой
void Foo(OneOf<A, B> o)
{
o.Switch(
a => a.Hop(),
b => b.Skip()
);
}
Если вы добавите третий элемент в o, вы получите ошибку компилятора, так как вам нужно добавить обработчик Func внутри вызова switch.
Вы также можете сделать .Match
, который возвращает значение, а не выполняет инструкцию:
double Area(OneOf<Square, Circle> o)
{
return o.Match(
square => square.Length * square.Length,
circle => Math.PI * circle.Radius * circle.Radius
);
}