.NET泛型中的重载运算符约束的解决方案

时间:2020-03-06 14:51:42  来源:igfitidea点击:

如果我想拥有只接受已重载运算符(例如减法运算符)的类型的通用方法,该怎么办。我尝试使用接口作为约束,但是接口不能有运算符重载。

实现此目标的最佳方法是什么?

解决方案

目前尚无立即答案。运算符是静态的,不能在约束中表示,并且现有的基元不实现任何特定的接口(与IComparable [<T>]相比,可以用来模拟大于/小于)。

然而;如果我们只是想让它工作,那么在.NET 3.5中有一些选择...

我在这里建立了一个库,该库允许使用诸如以下的泛型高效而简单地访问运算符:

T result = Operator.Add(first, second); // implicit <T>; here

可以作为MiscUtil的一部分下载

另外,在C4.0中,可以通过dynamic实现:

static T Add<T>(T x, T y) {
    dynamic dx = x, dy = y;
    return dx + dy;
}

我还曾经(曾经)拥有过一个.NET 2.0版本,但是该版本的测试较少。另一个选择是创建一个界面,例如

interface ICalc<T>
{
    T Add(T,T)() 
    T Subtract(T,T)()
}

等等,但是我们需要通过所有方法传递一个ICalc <T>;`,这会很混乱。