Я бы, вероятно, не использовал бы тип непосредственно из 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, ...)
При этом используются параметры byref
, которые отображаются в виде out
параметров в C #, поэтому вы можете написать:
int num;
string str;
if (choice.TryGetChoice1Of2(out num)) // ...
else if (choice.TryGetChoice2Of2(out str)) // ...
else // assert(false)
Это определенно более приятный способ работы с типом из C # (и он использует шаблон, знакомый, например, по работе с Int32.TryParse
).