Я получаю доступ к объединению, отличающемуся от F #, используя C # и пытаюсь использовать оператор switch в случаях объединения. Это прекрасно работает для значений, которые имеют хотя бы одно поле, но не для пустых значений, поскольку для них не создан соответствующий класс, только свойство. Рассмотрим следующий F # дискриминируемый союз.
type Letter = A of value:int | B of value:string | C | D
В C # у меня есть следующий оператор switch внутри функции, которая имеет букву аргумента типа Letter:
switch (letter)
{
case A a: Console.WriteLine(a.value); break;
case B b: Console.WriteLine(b.value); break;
default:
if (letter.IsC) Console.WriteLine("C");
else if (letter.IsD) Console.WriteLine("D");
}
Случай по умолчанию обрабатывает случаи, когда значение объединения пусто. Я бы предпочел:
switch (letter)
{
case A a: Console.WriteLine(a.value); break;
case B b: Console.WriteLine(b.value); break;
case C c: Console.WriteLine("C"); break;
case D d: Console.WriteLine("D"); break;
}
Но это не работает, потому что имена типов C и D не существуют - C и D являются свойствами, а не типами. Я могу обойти это, дав C и D поле типа unit, но это не очень элегантно. Почему типы создаются только для непустых значений различаемых объединений и каков лучший обходной путь?