c#操作符作为函数

本文关键字:函数 操作符 | 更新日期: 2023-09-27 18:16:16

是否有一种方法可以使用操作符作为函数而无需手动声明它们?

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((&&))

c#操作符作为函数

No。

您可以找到可以重载的操作符的定义(在VS中为F12),并且存在

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

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

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

出于文档目的:用户定义的操作符是函数,但是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 

如果我明白你想做什么,你可以使用System.ReflectionDelegate.CreateDelegate来创建一个委托操作符方法。

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

:

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