C #에서 다른 차원의 기하학적 엔티티와 작동 할 수있는 일반 알고리즘을 작성하려고합니다.
내가 가지고있는 다음과 같은 인위적인 예에서 Point2와 Point3둘 다 간단한 구현 IPoint인터페이스를.
이제 함수 GenericAlgorithm를 호출하는 함수가 GetDim있습니다. 유형에 따라이 기능에 대한 여러 정의가 있습니다. 구현하는 모든 것에 대해 정의 된 폴백 함수도 있습니다 IPoint.
처음에 다음 프로그램의 출력은 2, 3이 될 것으로 예상했지만 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 !!
}
}
어떤 이유로 콘크리트 유형 정보가에서 손실됩니다 GenericAlgorithm. 왜 이런 일이 일어나는지 완전히 이해하지 못하지만 괜찮습니다. 이 방법으로 할 수 없다면 다른 대안이 있습니까?
GetDim(즉, 전달 Point4하지만 GetDim<Point4>존재하지 않습니다). 그러나 컴파일러가 특수 구현을 찾는 것을 귀찮게하지는 않습니다.
NumDims속성을 사용할 수 있도록하는 것입니다. 어떤 경우에는 왜 그것을 무시합니까?