C#运算符作为函数

11

有没有一种方法可以在不手动声明的情况下使用运算符作为函数?

Func<bool, bool> not = x => !x;

类似于 Haskell 中的 (+)/(-)。在涉及条件查询构建的各种 LINQ 场景中非常方便。也许有一些我不知道的 C#(4.0+)技巧。

编辑:这里是一个样例,以澄清我的意思:

 int MyWhere(Func<bool, bool, bool> cond) {}
一个通常的调用会是:
MyWhere((x,y) => x && y)
一个很酷的调用方式(假设按照 Haskell 的风格)是:
MyWhere((&&))

在Haskell中,(+)/(-)是做什么用的?我懂C#,但不确定你想实现什么。 - Jens
2
"+" 和 "-" 是中缀运算符,但可以通过 () 语法轻松转换为常规函数,因此您可以将 2 + 3 写成 (+) 2 3。 - UserControl
我不太明白这个问题,请您详细阐述一下,最好能提供一个例子。 - Nawaz
你真正想做什么?原则上,你可以通过反射获取操作符方法op_Addition等,但选择正确的重载并不容易。 - CodesInChaos
1
你可以以调用方式调用运算符函数。在IL中,编写IL代码会是一个不错的练习。call class Program/X class Program/X::op_Addition(class Program/X, class Program/X)... - sehe
3个回答

9

编号。

您可以在VS中使用F12查找可以重载的运算符的定义,同时存在一个

 // struct Double
 public static bool operator ==(double left, double right);

但是没有办法调用Double.operator==(a, b)

框架确实为这种情况提供了a.Equals(b),但是没有a.Add(b)


7
为了记录:用户定义的运算符是函数,但C#语言明确禁止显式调用(不知道原因)。例如:
public class X
{
    public static X operator+(X a, X b)
    {
        return new X();
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        var q = new X() + new X();
        X.op_Addition(q,q); // error CS0571: 
        //   `Program.X.operator +(Program.X, Program.X)': cannot explicitly
        //   call operator or accessor
    }
}

如果你要编写IL代码,你会写成这样:
newobj instance void class X::'.ctor'()
newobj instance void class X::'.ctor'()
call class X class X::op_Addition(class X, class X)
stloc.0 

1

如果我正确理解你想要做的事情,你可以使用 System.ReflectionDelegate.CreateDelegate 来创建一个委托到操作符方法。

当然,我从未测试过它,但操作符方法是方法,所以应该可以工作。 这也可以自动化(与直接方法相比节省时间)。

参见:

http://msdn.microsoft.com/de-de/library/53cz7sc6.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接