簡體   English   中英

為什么lambda可以將函數調用轉換為Action?

[英]Why can lambdas convert function calls into Actions?

在此代碼片段中:

List<String> names = new List<String>();
names.Add("Bruce");
names.Add("Tom");
names.Add("Tim");
names.Add("Richard");

names.ForEach(x => Print(x));

private static string Print(string s)
{
    Console.WriteLine(s);
    return s;
}

Print返回string ,所以Print並不是確定的Action ; 但是x=> Print(x)是為什么?

Lambda表達式x => Print(x)類型基於其上下文確定。 由於編譯器知道將lambda分配給Action<string> ,因此編譯器無視Print(s)方法的返回類型,就好像它是語句表達式一樣

這是有效的轉換:

Action<string> myAction = y => Print(y);

換句話說,兩者

Print("something");

int x = Print("something");

Print方法的正確用法; 它們可以以相同的方式在lambda中使用。

x => Print(x)是一個lambda,在這里它等效為:

void MyPrintLambda(string x) { Print(x); }

如果上下文要求一個Func<string, string> ,那就應該是這樣:

string MyPrintLambda(string x) { return Print(x); }

或者,如果它是Func<string, object> ,則可能是這樣的:

object MyPrintLambda(string x) { return Print(x); }

因為編譯器可以通過簡單地忽略返回類型(即第一個示例)將x => Print(x)轉換為Action<string> ,所以它可以進行編譯。

出於同樣的原因,這將是有效的:

foreach (string name in names)
{
    Print(name);
}

Print()方法也在該代碼中返回一個值,但是沒有人會期望這是一個錯誤。 只允許丟棄返回值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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