さまざまな次元の幾何学的エンティティを処理できる汎用アルゴリズムをC#で記述しようとしています。
次の不自然な例ではPoint2、とを使用していますがPoint3、どちらも単純なIPointインターフェースを実装しています。
これで、関数GenericAlgorithmを呼び出す関数ができましたGetDim。タイプに基づいて、この関数には複数の定義があります。を実装するものに対して定義されているフォールバック関数もありますIPoint。
最初は、次のプログラムの出力が2、3であると予想していましたが、0、0です。
interface IPoint {
public int NumDims { get; }
}
public struct Point2 : IPoint {
public int NumDims => 2;
}
public struct Point3 : IPoint {
public int NumDims => 3;
}
class Program
{
static int GetDim<T>(T point) where T: IPoint => 0;
static int GetDim(Point2 point) => point.NumDims;
static int GetDim(Point3 point) => point.NumDims;
static int GenericAlgorithm<T>(T point) where T : IPoint => GetDim(point);
static void Main(string[] args)
{
Point2 p2;
Point3 p3;
int d1 = GenericAlgorithm(p2);
int d2 = GenericAlgorithm(p3);
Console.WriteLine("{0:d}", d1); // returns 0 !!
Console.WriteLine("{0:d}", d2); // returns 0 !!
}
}
OK、そのため、何らかの理由で具体的な型情報がで失われGenericAlgorithmます。なぜこれが起こるのか完全にはわかりませんが、問題ありません。この方法でそれができない場合、他にどのような選択肢がありますか?
GetDim(つまり、aを渡すPoint4がGetDim<Point4>存在しない場合)は、フォールバック関数が必要であると考えました。ただし、コンパイラーが特別な実装を探すのに煩わしいとは思われません。
NumDimsプロパティが利用可能であることを保証することです。なぜそれを無視しているのですか?