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

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

如果我想要一个只接受重载运算符的类型的泛型方法,例如减法运算符,我该怎么办?我尝试使用接口作为约束,但接口不能有运算符重载。

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


jeck猫
浏览 506回答 3
3回答

隔江千里

没有立即的答案;&nbsp;运算符是静态的,不能用约束表示 - 并且现有的主表不会实现任何特定的接口(与IComparable [<T>]形成对比,后者可用于模拟大于/小于)。然而;&nbsp;如果你只是想让它工作,那么在.NET 3.5中有一些选择......我在这里放了一个库,允许使用泛型有效和简单地访问操作符 - 例如:T&nbsp;result&nbsp;=&nbsp;Operator.Add(first,&nbsp;second);&nbsp;//&nbsp;implicit&nbsp;<T>;&nbsp;here它可以作为MiscUtil的一部分下载此外,在C#4.0中,这可以通过dynamic以下方式实现:static&nbsp;T&nbsp;Add<T>(T&nbsp;x,&nbsp;T&nbsp;y)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;dynamic&nbsp;dx&nbsp;=&nbsp;x,&nbsp;dy&nbsp;=&nbsp;y; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dx&nbsp;+&nbsp;dy;}我也(曾经)有一个.NET 2.0版本,但是测试的次数较少。另一种选择是创建一个接口,如interface&nbsp;ICalc<T>{ &nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;Add(T,T)()&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;Subtract(T,T)()}等等,但是你需要传递ICalc<T>;所有方法,这会变得混乱。

阿晨1998

我发现IL实际上可以很好地处理这个问题。防爆。ldarg.0ldarg.1add ret在通用方法中编译,只要指定了基本类型,代码就会运行良好。可以将其扩展为在非基本类型上调用操作符函数。看到这里。
打开App,查看更多内容
随时随地看视频慕课网APP