Sto cercando di scrivere algoritmi generici in C # che possano funzionare con entità geometriche di diversa dimensione.
Nel seguente esempio inventato ho Point2
e Point3
, entrambi implementando una semplice IPoint
interfaccia.
Ora ho una funzione GenericAlgorithm
che 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 Point4
ma GetDim<Point4>
non esiste). Tuttavia, non sembra che il compilatore si preoccupi di cercare un'implementazione specializzata.
NumDims
disponibilità della proprietà. Perché lo stai ignorando in alcuni casi?