簡體   English   中英

C#中實際的lambda類型是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM