如果我想要一个只接受重载运算符的类型的泛型方法,例如减法运算符,我该怎么办?我尝试使用接口作为约束,但接口不能有运算符重载.
实现这一目标的最佳方法是什么?
没有立即的答案; 运算符是静态的,不能用约束表示 - 并且现有的主表不会实现任何特定的接口(与IComparable [
然而; 如果你只是想让它工作,那么在.NET 3.5中有一些选择......
我在这里放了一个库,允许使用泛型有效和简单地访问操作符 - 例如:
T result = Operator.Add(first, second); // implicit; here
它可以作为MiscUtil的一部分下载
此外,在C#4.0中,这可以通过dynamic
以下方式实现:
static T Add(T x, T y) { dynamic dx = x, dy = y; return dx + dy; }
我也(曾经)有一个.NET 2.0版本,但是测试的次数较少.另一种选择是创建一个接口,如
interface ICalc{ T Add(T,T)() T Subtract(T,T)() }
等等,但是你需要传递ICalc
所有方法,这会变得混乱.
我发现IL实际上可以很好地处理这个问题.防爆.
ldarg.0 ldarg.1 add ret
在通用方法中编译,只要指定了基本类型,代码就会运行良好.可以将其扩展为在非基本类型上调用操作符函数.
看到这里.