Próbuję pisać ogólne algorytmy w języku C #, które mogą pracować z elementami geometrycznymi o innym wymiarze.
W poniższym wymyślonym przykładzie mam Point2i Point3oba, implementujące prosty IPointinterfejs.
Teraz mam funkcję, GenericAlgorithmktóra wywołuje funkcję GetDim. Istnieje wiele definicji tej funkcji w zależności od typu. Istnieje również funkcja rezerwowa zdefiniowana dla wszystkiego, co implementuje IPoint.
Początkowo spodziewałem się, że wynikiem następującego programu będzie 2, 3. Jest to jednak 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, więc z jakiegoś powodu zaginęła konkretna informacja o typie GenericAlgorithm. Nie do końca rozumiem, dlaczego tak się dzieje, ale dobrze. Jeśli nie mogę tego zrobić w ten sposób, jakie mam inne alternatywy?
GetDim(tzn. Przekazuję, Point4ale GetDim<Point4>nie istnieje). Wydaje się jednak, że kompilator nie chce szukać specjalnej implementacji.
NumDimswłaściwość jest dostępna. Dlaczego w niektórych przypadkach ignorujesz to?