我正在使用C#访问一个F#的判定联合(discriminated union),并尝试使用switch语句处理该联合的情况。这对于至少有一个字段的值很好用,但是对于空值则不行,因为这些空值没有相应的类生成,只有一个属性。考虑以下的F# 判定联合:
type Letter = A of value:int | B of value:string | C | D
在C#中,我有以下带有参数Letter的函数内部的switch语句:
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 类型的字段来绕过这个问题,但这并不太优雅。为什么类型只能为非空辨别联合值创建,并且最佳解决方法是什么?