如何约束泛型参数来实现基本的数学运算符?

Tom*_*onk 4 .net vb.net

有没有办法可以做到这一点?

我想有一个T的集合类,可以在T类型上做加法,减法.我想保持T泛型,而不是让几个集合具有相同的代码,但不同的类型.

你如何约束通用T?

示例:我想定义一个Collection(T作为IDoMaths).我不想用命名方法创建我自己的整数等类来进行操作,因为我觉得它会慢一些.这部分代码实际上经常被调用,并且往往是性能的瓶颈.

Jon*_*eet 7

不幸的是你不能.

有一个解决方法,Marc Gravell已经将其作为MiscUtil的一部分实现了(也有一篇更为一般性的文章).它很整洁,但你确实失去了静态类型检查.

在类似的情况下(在丢失类型检查方面)dynamic,C#4.0 的新功能允许您以任意方式使用运算符,只在执行时解析它们:

dynamic x = 10.0;
dynamic y = 3.0;
double z = x / y; // z = 3.3333333 (double arithmetic)

dynamic a = 10;
dynamic b = 3;
int c = a / b; // c = 3 (integer arithmetic)
Run Code Online (Sandbox Code Playgroud)

就在今天下午,我用它来实现一个动态的形式Enumerable.Sum.我即将对它进行基准测试.Marc Gravell 最近写了一篇关于此事的博客文章.

如果你正在使用VB,那么Option Strict关闭你希望延迟绑定的代码部分可能会产生相同的效果,但是我不熟悉VB,就像我对C#一样熟悉,我很害怕.