Ich versuche, generische Algorithmen in C # zu schreiben, die mit geometrischen Objekten unterschiedlicher Dimension arbeiten können.
Im folgenden erfundenen Beispiel habe ich Point2
und Point3
beide implementieren eine einfache IPoint
Schnittstelle.
Jetzt habe ich eine Funktion GenericAlgorithm
, die eine Funktion aufruft GetDim
. Je nach Typ gibt es mehrere Definitionen dieser Funktion. Es gibt auch eine Fallback-Funktion, die für alles definiert ist, was implementiert wird IPoint
.
Ich habe anfangs erwartet, dass die Ausgabe des folgenden Programms 2, 3 ist. Es ist jedoch 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, aus irgendeinem Grund gehen die konkreten Typinformationen in verloren GenericAlgorithm
. Ich verstehe nicht ganz, warum das passiert, aber gut. Welche anderen Alternativen habe ich, wenn ich es nicht so machen kann?
GetDim
(dh ich übergebe eine Point4
, GetDim<Point4>
aber nicht vorhanden). Es scheint jedoch nicht, dass der Compiler sich die Mühe macht, nach einer speziellen Implementierung zu suchen.
NumDims
Eigenschaft verfügbar ist. Warum ignorierst du es in einigen Fällen?