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 Point2
et Point3
, tous deux implémentant une IPoint
interface simple .
Maintenant, j'ai une fonction GenericAlgorithm
qui 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 Point4
mais GetDim<Point4>
n'existe pas). Cependant, il ne semble pas que le compilateur se soucie de rechercher une implémentation spécialisée.
NumDims
disponibilité de la propriété. Pourquoi l'ignorez-vous dans certains cas?