2011-05-02 134 views
17

我不明白這裏發生了什麼:Func <T>如何隱式轉換爲表達式<Func<T>>?

這兩行的編譯:

Func<object> func =() => new object(); 

Expression<Func<object>> expression =()=>new object(); 

但這並不:

expression = func; 

沒有一個隱含的操作上LambdaExpressionExpression<TDelegate>將委託轉換爲表達式,所以必須發生其他事情才能使委派工作。它是什麼?

回答

28

這不是通常意義上的隱式轉換 - 它是編譯器技巧。編譯器根據上下文檢測預期哪一個,然後將其編譯爲委託(類中的隱藏方法)或作爲表達式(通過調用System.Linq.Expressions.Expression上的方法來構造表達式的代碼塊)。

這是您不能直接將lambda表達式分配給類型爲objectvar的變量的原因,因爲編譯器必須能夠知道您是代表委託還是表達式。

+1

更多[here](http://msdn.microsoft.com/en-us/library/bb308966.aspx#csharp3.0overview_topic20)。 – 2011-05-02 20:49:13

+1

+1表示支持對象和變量的解釋。 – 2011-05-02 20:50:49

+5

重申最後 - 再加上它需要決定使用什麼委託類型*(或委託類型表達式); 「Func <...>」等沒有什麼特別之處。 – 2011-05-02 21:06:27

相關問題