C# C语言中的选择#

C# C语言中的选择#,c#,f#,C#,F#,我试图在C#项目中使用FSharpChoicetype。我创造了一个这样的选择 var a = FSharpChoice<T1,T2,T3>.NewChoice1Of3(instofT1); var a=FSharpChoice.NewChoice1Of3(instofT1); 现在,如何从选项类型中获取instofT1 我知道我可以执行一个IsChoice1Of3,但是如何获得choice对象中的值?将值强制转换为FSharpChoice。选择1of3并使用项属性 请参阅F#规

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

var a = FSharpChoice<T1,T2,T3>.NewChoice1Of3(instofT1);
var a=FSharpChoice.NewChoice1Of3(instofT1);
现在,如何从选项类型中获取
instofT1


我知道我可以执行一个
IsChoice1Of3
,但是如何获得choice对象中的值?

将值强制转换为
FSharpChoice。选择1of3
并使用
属性


请参阅F#规范中有关如何表示区分并集的更多信息。

我可能不会直接使用C中的类型-您可以这样做,但生成的代码不会很好。我可能会声明自己的
选择
类型,如下所示:

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#中的类型时,这无疑是一种更令人愉快的方式(它使用了类似的模式,例如,使用
Int32.TryParse
)。

创建一个“兼容层”,以便可以更容易地从C#中使用FSharp.Core。特别是,它使通用的有区别的并集可以从C#中使用,例如:

var choice = Choice.New1Of3<int,string,string>(100);
int r = choice.Match(i => i + 21, s => s.Length + 1, s => s.Length + 5);
var-choice=choice.New1Of3(100);
intr=choice.Match(i=>i+21,s=>s.Length+1,s=>s.Length+5);

这在受歧视的并集上进行模式匹配,类似于在F#中进行模式匹配,只是没有名字。

我喜欢这种方法,但我更喜欢朱丽叶在另一个答案中的方法:。我将其翻译为
类型IChoice@kvb:是的,看起来也很漂亮。(我会说更漂亮、更实用,但有点不那么犀利:-)也看到了吗
var choice = Choice.New1Of3<int,string,string>(100);
int r = choice.Match(i => i + 21, s => s.Length + 1, s => s.Length + 5);