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