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 Point2
e Point3
, ambos implementando uma IPoint
interface simples .
Agora eu tenho uma função GenericAlgorithm
que 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, Point4
mas GetDim<Point4>
não existe). No entanto, não parece que o compilador se preocupe em procurar uma implementação especializada.
NumDims
propriedade esteja disponível. Por que você está ignorando isso em alguns casos?