隐式运算符和 lambda



>我正在尝试创建一个类,该类获取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 是一种匿名类型,直到它被分配给表达式或委托,并且我(我相信)必须使用隐式运算符来获取我要的语法,但除此之外,我已经碰壁了。我可以在我的隐式运算符中使用 Expression 或 Func,如果它们已经被分配给一个变量,如下所示:

Expression<Func<T1, T2>> e = o => ...;
Func<T1, T2> f = o => ...;
Lambda<T1, T2> l1 = e, l2 = f;

但我更愿意只分配 lambda 本身并让类弄清楚细节。

问题是 C# 语言不会链接用户定义的隐式转换。

Lambda 表达式是非类型化表达式,可隐式转换为(可能无限的)兼容委托和表达式树类型集。 (参见规范的§6.5)

不能同时调用该隐式转换和用户定义的从委托类型到您自己的类型的隐式转换。

相反,您可以显式创建类型化委托:

Lambda<TIn, TOut> l = new Func<TIn, TOUt>(o => ... );

您还可以要求 C# 语言团队为用户定义的从方法组或 lambda 到任何类型的隐式转换定义语法。

当你实际定义lambda表达式时,它必须是明确的(如Action或Func etc)。如果这样做,则可以直接分配给委托类型的属性。

 public class myClass
 {
     public Delegate myDelegate { get; set; }
     public myClass(Delegate d)
     {
         myDelegate = d;
     }
 }

 myClass myInstance = new myClass(new Func<int, int>(x => x * x));

最新更新