C#运算符作为函数

Use*_*rol 8 c# functional-programming c#-4.0

有没有办法将运算符用作函数而无需手动声明它们?

Func<bool, bool> not = x => !x;
Run Code Online (Sandbox Code Playgroud)

与Haskell中的(+)/ 类似(-).在涉及条件查询构造的各种LINQ场景中会很方便.也许一些我不知道的C#(4.0+)技巧.

编辑:这是一个澄清我的意思的样本:

 int MyWhere(Func<bool, bool, bool> cond) {}
Run Code Online (Sandbox Code Playgroud)

通常的电话会是:

MyWhere((x,y) => x && y)
Run Code Online (Sandbox Code Playgroud)

一个很酷的电话会是(假设Haskell风格):

MyWhere((&&))
Run Code Online (Sandbox Code Playgroud)

Hen*_*man 8

没有.

你可以找到你可以重载的运算符的定义(VS中的F12),并且存在一个

 // struct Double
 public static bool operator ==(double left, double right);
Run Code Online (Sandbox Code Playgroud)

但是没有办法打电话Double.operator==(a, b).

该框架确实提供了 a.Equals(b)针对此特定情况的案例,但没有a.Add(b).


seh*_*ehe 6

出于记录目的:用户定义的运算符是函数,但是 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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你在写 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 
Run Code Online (Sandbox Code Playgroud)