【发布时间】:2018-09-01 00:29:05
【问题描述】:
我正在使用 C# 访问 F# 可区分联合,并尝试在联合的情况下使用 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 类型的字段来规避这个问题,但这不是很优雅。为什么只为非空的可区分联合值创建类型,最好的解决方法是什么?
【问题讨论】:
-
您是否尝试过将 F# 编译成程序集,然后反编译成 C#?
-
感谢您的建议。我在这里(fsharpforfunandprofit.com/posts/fsharp-decompiled)查看了反编译为 C# 的 F#,这导致了我在下面给出的答案。
标签: c# f# switch-statement discriminated-union