C# 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#规
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);