必要なのは、union
Cのa またはF#の判別共用体型です。どちらも、 C#の優れた構文で定義することはできません。
このコードは、同様のシナリオで使用するためのジェネリック クラスを提供します。
public class Either<A, B>
{
A _a;
B _b;
bool _isLeft;
private Either() { }
private Either(A a, B b, bool isLeft)
{
_isLeft = isLeft;
if (_isLeft)
{
_a = a;
return;
}
_b = b;
}
public Either(A a) : this(a, default(B), true) { }
public Either(B b) : this(default(A), b, false) { }
public A Left { get { return _a; } }
public B Right { get { return _b; } }
public bool HasLeft { get { return _isLeft; } }
}
HasLeft
どの値が実際に存在するかを確認する必要があります。オブジェクト フィールドと、静的に型付けされた言語では避けたいキャストを使用することもできます。他にも可能な解決策があります(dynamic
またはを使用struct
)が、これ(IMHO)で十分です。
注: もう 1 つの方法はcase class
、 a からeach を派生させることbase class
です。それについての悪いこと(私見)は、それぞれに個別のオーバーロードされた関数を提供する必要があることですcase class
。