Estou tentando escrever algoritmos genéricos em c # que podem funcionar com entidades geométricas de diferentes dimensões.
No exemplo a seguir, eu tenho Point2e Point3, ambos implementando uma IPointinterface simples .
Agora eu tenho uma função GenericAlgorithmque chama uma função GetDim. Existem várias definições dessa função com base no tipo. Há também uma função de fallback definida para qualquer coisa que implemente IPoint.
Inicialmente, eu esperava que a saída do programa a seguir fosse 2, 3. No entanto, é 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 algum motivo as informações do tipo concreto são perdidas GenericAlgorithm. Não entendo completamente por que isso acontece, mas tudo bem. Se não posso fazer dessa maneira, que outras alternativas tenho?
GetDim(ou seja, eu passo uma, Point4mas GetDim<Point4>não existe). No entanto, não parece que o compilador se preocupe em procurar uma implementação especializada.
NumDimspropriedade esteja disponível. Por que você está ignorando isso em alguns casos?