2014-02-18 74 views
9

我試圖創建一個需要lambda並將其存儲在內部的類。語法是這樣的:隱式運算符和lambdas

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類型,直到它被分配給一個表達式或一個委託,並且我會(我相信)必須使用一個隱式運算符來獲取我要去的語法,但除此之外,一堵牆。我可以使用表達或FUNC。在我隱運營商如果他們已經被分配給一個變量,像這樣:

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

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

但我更喜歡只分配拉姆達本身有級人物有關的細節。

回答

9

你的問題是,C#語言does not chain user-defined implicit conversions

Lambda表達式是無類型的表達式,它具有向(可能是無限的)一組兼容委託表達式樹類型的隱式轉換。 (請參閱規範的第6.5節)

您無法隱式地將隱式轉換和用戶定義的隱式轉換從委託類型調用到您自己的類型。

相反,你可以明確地創建一個類型代表:

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

你也可以問C#語言的團隊合作來確定從法團或lambda表達式到任何類型的用戶定義的隱式轉換語法。

+0

啊,我希望能避免:(好了,好了回覆感謝 –

+0

@SLaks - !我試圖寫一個類型轉換隱運營商從明確的類型完全可行的,但我想。將操作符抽象爲一個可以放置操作符的基類型(例如,BaseViewModel ),這對黃皮帶程序員來說甚至可能或者只是一個管道夢?如果它值得單獨的問題,讓我知道,我會發佈一個 –

+0

@SLaks - 或者一個接口,如果可能的話......只是強制操作符被實現用於類型轉換的東西...在這種情況下,從'BaseViewModel'繼承的'TViewModel'類,被迫執行操作符並定義轉換(例如'this.Prop1 = that.Prop1;') –

0

當您實際定義lambda表達式時,它需要是明確的(如Action或Func ect)。如果你這樣做,你可以直接分配給類型委託的屬性。

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