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