Sto cercando di scrivere algoritmi generici in C # che possano funzionare con entità geometriche di diversa dimensione.
Nel seguente esempio inventato ho Point2e Point3, entrambi implementando una semplice IPointinterfaccia.
Ora ho una funzione GenericAlgorithmche chiama una funzione GetDim. Esistono più definizioni di questa funzione in base al tipo. Esiste anche una funzione di fallback definita per tutto ciò che implementa IPoint.
Inizialmente mi aspettavo che l'output del seguente programma fosse 2, 3. Tuttavia, è 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, quindi per qualche motivo le informazioni sul tipo concreto vengono perse GenericAlgorithm. Non capisco bene perché questo accada, ma va bene. Se non posso farlo in questo modo, quali altre alternative ho?
GetDim(ovvero passo un Point4ma GetDim<Point4>non esiste). Tuttavia, non sembra che il compilatore si preoccupi di cercare un'implementazione specializzata.
NumDimsdisponibilità della proprietà. Perché lo stai ignorando in alcuni casi?