我正在尝试使用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
中具体类型信息丢失了。我不完全明白为什么会发生这种情况,但没关系。如果我无法通过这种方式实现,我有哪些其他选择呢?
NumDims
属性可用。为什么在某些情况下会忽略它呢? - John WuGetDim
的专门实现(即我传递一个Point4
但是GetDim<Point4>
不存在),则需要回退函数。然而,编译器似乎并不费心去寻找专门的实现。 - mohamedmoussa