为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
jeck猫 2019-08-08 16:54:44
.NET泛型中重载运算符约束的解决方案如果我想要一个只接受重载运算符的类型的泛型方法,例如减法运算符,我该怎么办?我尝试使用接口作为约束,但接口不能有运算符重载。实现这一目标的最佳方法是什么?
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

没有立即的答案; 运算符是静态的,不能用约束表示 - 并且现有的主表不会实现任何特定的接口(与IComparable [<T>]形成对比,后者可用于模拟大于/小于)。

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

我在这里放了一个库,允许使用泛型有效和简单地访问操作符 - 例如:

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

它可以作为MiscUtil的一部分下载

此外,在C#4.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>;所有方法,这会变得混乱。


查看完整回答
反对 回复 2019-08-08
?
阿晨1998

TA贡献2037条经验 获得超6个赞

我发现IL实际上可以很好地处理这个问题。防爆。

ldarg.0ldarg.1add
ret

在通用方法中编译,只要指定了基本类型,代码就会运行良好。可以将其扩展为在非基本类型上调用操作符函数。

看到这里


查看完整回答
反对 回复 2019-08-08
  • 3 回答
  • 0 关注
  • 505 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信