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((&&))
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.Reflection
和Delegate.CreateDelegate
来创建一个委托操作符方法。