我正在尝试创建一个接受 lambda 并将其存储在内部的类。语法类似于:
class Lambda<TIn, TOut> {
private Expression<Func<TIn, TOut>> expr;
private Func<TIn, TOut>> func;
public Lambda(Expression<Func<TIn, TOut>> e) {
expr = e;
}
public Lambda(Func<TIn, TOut> f) {
func = f;
}
public static implicit operator Lambda<TIn, TOut>([lambdatype] o) {
return new Lambda(o);
}
}
用法:
Lambda<TIn, TOut> l = o => ... ;
但是我在弄清楚细节时遇到了一些麻烦。我知道 lambda 是匿名类型,直到它被分配给表达式或委托(delegate),并且我(我相信)必须使用隐式运算符来获取我想要的语法,但除此之外我已经命中一堵墙。如果它们已经被分配给一个变量,我可以在我的隐式运算符中使用 Expression 或 Func:
Expression<Func<T1, T2>> e = o => ...;
Func<T1, T2> f = o => ...;
Lambda<T1, T2> l1 = e, l2 = f;
但我更愿意只分配 lambda 本身并让类(class)弄清楚细节。
最佳答案
您的问题是 C# 语言 does not chain user-defined implicit conversions .
Lambda 表达式是无类型表达式,可以隐式转换为(可能是无限的)一组兼容的委托(delegate)和表达式树类型。 (参见规范的 §6.5)
您不能同时调用从委托(delegate)类型到您自己的类型的隐式转换和用户定义的隐式转换。
相反,您可以显式创建类型化委托(delegate):
Lambda<TIn, TOut> l = new Func<TIn, TOUt>(o => ... );
您还可以要求 C# 语言团队为用户定义的从方法组或 lambda 到任何类型的隐式转换定义语法。
关于c# - 隐式运算符和 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21862650/