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)
没有.
你可以找到你可以重载的运算符的定义(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)
.
出于记录目的:用户定义的运算符是函数,但是 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)