J'essaie d'écrire des algorithmes génériques en C # qui peuvent fonctionner avec des entités géométriques de différentes dimensions.
Dans l'exemple artificiel suivant, j'ai Point2et Point3, tous deux implémentant une IPointinterface simple .
Maintenant, j'ai une fonction GenericAlgorithmqui appelle une fonction GetDim. Il existe plusieurs définitions de cette fonction en fonction du type. Il existe également une fonction de secours qui est définie pour tout ce qui est implémenté IPoint.
Au départ, je m'attendais à ce que la sortie du programme suivant soit 2, 3. Cependant, c'est 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, donc pour une raison quelconque, les informations de type concret sont perdues GenericAlgorithm. Je ne comprends pas vraiment pourquoi cela se produit, mais très bien. Si je ne peux pas le faire de cette façon, quelles autres alternatives ai-je?
GetDim(c'est-à-dire que je passe un Point4mais GetDim<Point4>n'existe pas). Cependant, il ne semble pas que le compilateur se soucie de rechercher une implémentation spécialisée.
NumDimsdisponibilité de la propriété. Pourquoi l'ignorez-vous dans certains cas?