.NETgenerics中重载操作符约束的解决scheme

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

达到这个目标的最好方法是什么?

没有直接的答案。 运算符是静态的,不能用约束来表示 – 而且现有的primatives没有实现任何特定的接口(与IComparable [<T>]相比,可以用来模拟大于/小于)。

然而; 如果你只是想要它的工作,然后在.NET 3.5中有一些选项…

我在这里放置了一个库,允许高效且简单地访问具有generics的操作员 – 例如:

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版本,但是这是lesstesting。 另一种select是创build一个接口如

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

等等,但是你需要通过ICalc<T>; 通过所有的方法,这得到凌乱。

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

 ldarg.0 ldarg.1 add ret 

在通用方法中编译,只要指定了基本types,代码就可以正常运行。 有可能扩展它来调用非基元types的运算符函数。

看到这里 。

有一段代码从国际上被盗,我用了很多。 它使用IL基本算术运算符查找或构build。 这一切都是在一个Operation<T>generics类中完成的,你所要做的就是将所需的操作分配给一个委托。 像add = Operation<double>.Add

它是这样使用的:

 public struct MyPoint { public readonly double x, y; public MyPoint(double x, double y) { this.x=x; this.y=y; } // User types must have defined operators public static MyPoint operator+(MyPoint a, MyPoint b) { return new MyPoint(a.x+bx, a.y+by); } } class Program { // Sample generic method using Operation<T> public static T DoubleIt<T>(T a) { Func<T, T, T> add=Operation<T>.Add; return add(a, a); } // Example of using generic math static void Main(string[] args) { var x=DoubleIt(1); //add integers, x=2 var y=DoubleIt(Math.PI); //add doubles, y=6.2831853071795862 MyPoint P=new MyPoint(x, y); var Q=DoubleIt(P); //add user types, Q=(4.0,12.566370614359172) var s=DoubleIt("ABC"); //concatenate strings, s="ABCABC" } } 

Operation<T>源代码粘贴bin: http : //pastebin.com/nuqdeY8z

与以下的署名:

 /* Copyright (C) 2007 The Trustees of Indiana University * * Use, modification and distribution is subject to the Boost Software * License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) * * Authors: Douglas Gregor * Andrew Lumsdaine * * Url: http://www.osl.iu.edu/research/mpi.net/svn/ * * This file provides the "Operations" class, which contains common * reduction operations such as addition and multiplication for any * type. * * This code was heavily influenced by Keith Farmer's * Operator Overloading with Generics * at http://www.codeproject.com/csharp/genericoperators.asp * * All MPI related code removed by ja72. */