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 Point2
y Point3
, ambos implementamos una IPoint
interfaz simple .
Ahora tengo una función GenericAlgorithm
que 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 Point4
pero GetDim<Point4>
no existe). Sin embargo, no parece que el compilador se moleste en buscar una implementación especializada.
NumDims
propiedad esté disponible. ¿Por qué lo ignoras en algunos casos?