是否可以指定运算符R
,其中R
可以是算术运算符,关系运算符或逻辑运算符?
例如计算
的函数c = a R b
我可以指定R
是+, -, *, /
可以在C#中完成吗?
答案 0 :(得分:7)
binary operator是接受两个操作数的任何函数。使用delegates抽象此功能很简单,它基本上是方法(函数)的包装。
为了更清楚,我们可以定义一个泛型方法,它不再使用指定的参数调用委托,并返回其结果:
public Tout GetResult<TIn, TOut>(TIn a, TIn b, Func<TIn, TIn, TOut> @operator)
{
return @operator(a, b);
}
您可以使用它来传递参数和运算符的任意组合:
private bool AreEqual(int a, int b)
{
return a.Equals(b);
}
private int Subtract(int a, int b)
{
return a - b;
}
然后,您可以使用相同的通用方法执行您想要的任何操作:
// use the "AreEqual" operator
bool equal = GetResult(10, 10, AreEqual);
// use the "Subtract" operator
int difference = GetResult(10, 10, Subtract);
使用lambda表达式,您甚至可以“动态”创建运算符,方法是将其指定为匿名方法:
// define a "Product" operator as an anonymous method
int product = GetResult(10, 10, (a,b) => a*b);
答案 1 :(得分:2)
你可以使用lambda做一些非常接近的事情:
Func<int, int, int> op = (x, y) => x + y; // or any other operator
然后像任何其他代表一样使用它:
int result = op(1, 2);
如果有问题的类型是用户定义的重载运算符,你可以使用反射,但我担心像int
这样的类型是不可能的。
答案 2 :(得分:0)
答案 3 :(得分:-3)
可以在C#中进行运算符重载,检查一些MSDN
http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx