C#不支持此功能。Hejlsberg 在接受Bruce
Eckel的采访时描述了不实现该功能的原因:
尚不清楚增加的复杂性是否值得您获得少量收益。如果约束系统中不直接支持您要执行的操作,则可以使用工厂模式来执行。
Matrix<T>例如,您可能有一个,并且Matrix您想定义一个点积方法。那当然,这意味着你最终需要了解如何乘两个T你S,但也不能说,作为一个约束,至少不是如果T是int,double或float。但是,您可以做的是Matrix将a作为参数Calculator<T>,并输入Calculator<T>一个名为的方法multiply。您去实现它,然后将其传递给Matrix。
但是,这导致了相当复杂的代码,用户必须为要使用的
Calculator<T>每个代码提供自己的实现
T。只要它不必是可扩展的,即如果您只想支持固定数量的类型(例如
int和)
double,就可以使用一个相对简单的界面:
var mat = new Matrix<int>(w, h);
(GitHub
Gist中的最小实现。)
但是,一旦您希望用户能够提供自己的自定义类型,就需要打开此实现,以便用户可以提供自己的
Calculator实例。例如,要实例化使用自定义十进制浮点实现的矩阵
DFP,您必须编写以下代码:
var mat = new Matrix<DFP>(DfpCalculator.Instance, w, h);
…并实现的所有成员
DfpCalculator : ICalculator<DFP>。
不幸的是,有一个共同的限制,那就是使用策略类,如Sergey
Shandar的答案所述。



