C#中的FSharpChoice
我试图在C#项目中使用FSharpChoice
类型。 我创造了一个这样的选择
var a = FSharpChoice.NewChoice1Of3(instofT1);
现在我如何从选择类型中获取instofT1
。
我看到我可以做一个IsChoice1Of3
但是如何获得选择对象中的值?
将值转换为FSharpChoice
并使用Item
属性。
有关如何表示受歧视的联合的详细信息,请参阅F#规范中其他CLI语言的联合类型的编译表单 。
我可能不会直接使用C#中的类型 – 你可以这样做,但结果代码不会很好。 我可能会声明我自己的Choice
类型,如下所示:
type Choice<'T1, 'T2> private (opt1, opt2) = member x.TryGetChoice1Of2(arg:byref<'T1>) = //' match opt1 with | Some v -> arg <- v; true | _ -> false // Similar code for 'TryGetChoice2Of2' type Choice = // static methods for creating (Choice1Of2, ...)
这使用了参数,它们在C#中显示为out
参数,因此您可以编写:
int num; string str; if (choice.TryGetChoice1Of2(out num)) // ... else if (choice.TryGetChoice2Of2(out str)) // ... else // assert(false)
这绝对是使用C#类型的更愉快的方式(并且它使用熟悉的模式,例如,使用Int32.TryParse
)。
我最近开始了一个项目来创建一个“兼容层”,以便可以更容易地从C#中消耗FSharp.Core。 特别是,它使得通用的区分联合可以从C#中使用,例如:
var choice = Choice.New1Of3(100); int r = choice.Match(i => i + 21, s => s.Length + 1, s => s.Length + 5);
这会对区分联合进行模式匹配,类似于在F#中进行模式匹配,除了没有名称。