![](/img/trans.png)
[英]What are C# lambda's compiled into? A stackframe, an instance of an anonymous type, or?
[英]What's the actual type of lambda in C#?
我讀到C#lambdas可以被非法轉換為Action或Func,但是lambda不能直接執行定義lambda函數並立即執行它例如:
int n = (()=>5)(); //doesn't work
int n = ((Func<int>)(()=>5))(); //works
那么lambda的實際類型是什么?為什么不能直接調用它? 是因為C#類型系統比Haskell或Scala系統“弱”嗎?
lambda表達式沒有類型。 它不能,因為它可能擁有的.NET世界中的任何類型,也會硬編碼lambda的參數和結果的類型。 現在考慮:
x => x + 1
x
可以使用什么類型? 結果是什么類型的? 沒有任何單一答案,lambda表達式確實可以轉換為Func<int, int>
, Func<double, double>
和許多其他具有不同參數的委托類型。 給lambda表達式一個類型會禁止這樣的表達式。 C#確實想要允許這樣的表達式,所以設計的不是給這樣的表達式任何類型。
這是因為() => 5
可以與各種委托類型兼容(例如,您可能有一個不帶任何東西並返回int
的自定義delegate
)。 並且為了創建delegate
,編譯器必須知道確切的類型。 它不能只選擇適合您需求的隨機類型。 這就是為什么除非你將它轉換為實際的委托類型,否則你不能Invoke
它。
在類似於方法需要delegate
,編譯器會隱式執行該轉換:
void Foo(Func<int> func) { }
Foo(() => 5);
同樣重要的是要知道delegates
實際上是幕后的類。 每次創建delegate
實例時,編譯器都會創建class
的實例。 因此,無論哪種方式,您都必須指定一個類型,以便編譯器知道要使用哪種類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.