C#中的FSharpChoice

我试图在C#项目中使用FSharpChoice类型。 我创造了一个这样的选择

 var a = FSharpChoice.NewChoice1Of3(instofT1); 

现在我如何从选择类型中获取instofT1

我看到我可以做一个IsChoice1Of3但是如何获得选择对象中的值?

将值转换为FSharpChoice.Choice1Of3并使用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#中进行模式匹配,除了没有名称。