隐式运算符和lambdas

时间:2014-02-18 18:43:24

标签: c# lambda delegates expression implicit-conversion

我正在尝试创建一个带有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是一个anon类型,直到它被分配给一个表达式或一个委托,并且我(我相信)必须使用一个隐式运算符来获取我想要的语法,但除此之外我已经命中了一堵墙。我可以在隐式运算符中使用Expression或Func,如果它们已经被赋值给变量,那么:

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

Lambda<T1, T2> l1 = e, l2 = f;

但是我更喜欢只分配lambda本身并让类弄清楚细节。

2 个答案:

答案 0 :(得分:9)

您的问题是C#语言does not chain user-defined implicit conversions

Lambda表达式是无类型表达式,具有对(可能是无限的)兼容委托&amp;组的隐式转换。表达式树类型。 (见规范§6.5)

您无法隐式地将隐式转换和用户定义的隐式转换从委托类型调用到您自己的类型。

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

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

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

答案 1 :(得分:0)

当您实际定义lambda表达式时,它需要是显式的(如Action或Func等)。如果这样做,您可以直接分配给委托类型的属性。

 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));