假設我有此委託的聲明:Delegate.Combine和lambda表達式
private delegate UInt32 Feedback(UInt32 value);
在這裏,我嘗試用lambda表達式
feedback = (Feedback)Delegate.Combine(feedback,
value => { Console.WriteLine("Lambda item = " + value); return 0; });
使用它,但我得到的錯誤:無法轉換lambda表達式鍵入'System.Delegate',因爲它不是委託類型
但是它的工作原理是這樣的
feedback = (Feedback)Delegate.Combine(feedback,
new Func<UInt32, UInt32>(value => { Console.WriteLine("Lambda item = " + value); return 0; }));
我以爲C#編譯器必須自己做。
是因爲* value *是一個值類型,編譯器不能使用Contra-variance? – Yola 2015-02-24 08:49:53
@Yola編譯器如何知道值是否是一個uint?它可以是任何類型 – 2015-02-24 08:51:38
@Yola不,這是因爲'Delegate.Combine'具有參數'Delegate',並且通過查看您的函數,它無法知道參數的類型(什麼是「值」?一個字符串),即使它知道參數/返回值的類型,.NET中的「相似」委託之間也沒有等效(類似委託=具有相同簽名的委託) – xanatos 2015-02-24 08:51:51