Estoy tratando de escribir algoritmos genéricos en C # que pueden funcionar con entidades geométricas de diferentes dimensiones.
En el siguiente ejemplo artificial que tengo Point2y Point3, ambos implementamos una IPointinterfaz simple .
Ahora tengo una función GenericAlgorithmque llama a una función GetDim. Existen múltiples definiciones de esta función según el tipo. También hay una función alternativa que se define para cualquier cosa que implemente IPoint.
Inicialmente esperaba que la salida del siguiente programa fuera 2, 3. Sin embargo, es 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, por alguna razón, la información del tipo concreto se pierde GenericAlgorithm. No entiendo completamente por qué sucede esto, pero está bien. Si no puedo hacerlo de esta manera, ¿qué otras alternativas tengo?
GetDim(es decir, paso un Point4pero GetDim<Point4>no existe). Sin embargo, no parece que el compilador se moleste en buscar una implementación especializada.
NumDimspropiedad esté disponible. ¿Por qué lo ignoras en algunos casos?