一尘不染

是否存在将我的通用方法限制为数字类型的约束?

c#

谁能告诉我泛型是否可以将泛型类型参数限制T为仅:

  • Int16
  • Int32
  • Int64
  • UInt16
  • UInt32
  • UInt64

我知道这个where关键字,但是找不到 仅适用于 这些类型的接口,

就像是:

static bool IntegerFunction<T>(T value) where T : INumeric

阅读 250

收藏
2020-05-19

共1个答案

一尘不染

C#不支持此功能。Hejlsberg 在接受Bruce
Eckel的采访时
描述了不实现该功能的原因:

尚不清楚增加的复杂性是否值得您获得少量收益。如果约束系统中不直接支持您要执行的操作,则可以使用工厂模式来执行。Matrix<T>例如,您可能有一个,并且Matrix您想定义一个点积方法。那当然,这意味着你最终需要了解如何乘两个T你S,但也不能说,作为一个约束,至少不是如果Tintdoublefloat。但是,您可以做的是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的答案所述

2020-05-19