C# から F# の識別共用体を使用するのは、コンパイル方法が原因で少し洗練されていません。
最善の方法は、C# の型の使用を簡素化するいくつかのメンバーを (F# 側で) 定義することだと思います。複数のオプションがありますが、私が好むのは、 と と同様に動作するメソッドを定義することですTryLeft
(TryRight
したがってInt32.TryParse
、F# API を使用する C# 開発者にはなじみがあるはずです)。
open System.Runtime.InteropServices
type Either<'a,'b> =
| Left of 'a
| Right of 'b
member x.TryLeft([<Out>] a:byref<'a>) =
match x with Left v -> a <- v; true | _ -> false
member x.TryRight([<Out>] b:byref<'b>) =
match x with Right v -> b <- v; true | _ -> false
次に、次のように C# の型を使用できます。
int a;
string s;
if (v.TryLeft(out a)) Console.WriteLine("Number: {0}", a);
else if (v.TryRight(out s)) Console.WriteLine("String: {0}", s);
これを行うと F# の安全性がいくらか失われますが、これはパターン マッチングのない言語では当然のことです。しかし、幸いなことに、.NET に詳しい人なら誰でも F# で実装された API を使用できるはずです。
もう 1 つの方法は、左右のケースによって運ばれる値を使用して、右側のデリゲートをMatch
取りFunc<'a>
、デリゲートして呼び出すメンバーを定義することです。Func<'b>
これは、機能の観点からは少し優れていますが、C# の呼び出し元にはわかりにくいかもしれません。