[英]What is this line? X = Y => Z(Y)
我在閱讀有關Web API 2和Entity Framework的文章:
this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
我查找了=>
運算符,發現它與lambda有關,盡管我仍不確定它到底適合什么或發生了什么。 有人可以幫我嗎? 這條線是怎么回事?
this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
基本上是指:
this.Database.Log = blah;
void blah(string s)
{
System.Diagnostics.Debug.WriteLine(s);
}
Database.Log的類型為Action<T>
,這是一個委托類型。
因此,當this.Database要記錄內容時,將其稱為“ Log”屬性,它是Action<string>
。 由於它是一個Action<string>
(更重要的是Action<T>
是委托類型),因此您可以分配一個不返回任何值且具有單個參數(即字符串)的方法,或者分配具有單個參數的lamda (也是字符串)(並且沒有返回值)。
Database.Log
屬性的類型為Action<string>
。 這意味着它是一個接受字符串且沒有返回值的委托 (即,其返回類型為void
)。 因此,此行將匿名函數分配給Log
屬性,該匿名函數接受string
值並將其寫入調試器窗口。
因為您是將lambda表達式分配給具有已知委托類型的屬性,所以編譯器可以推斷參數s
類型並從上下文返回類型。 這是簡寫
this.Database.Log = (delegate (string s){ System.Diagnostics.Debug.WriteLine(s); });
反過來,這是創建私有方法並為該私有方法分配委托引用的簡稱(如其他答案所述):
this.Database.Log = (Action<string>)__compiler_generated_function__;
private void __compiler_generated_function__(string s) {
System.Diagnostics.Debug.WriteLine(s);
}
這意味着將一個函數分配給this.Database.Log
。 當this.Database.Log
執行時,它會找到函數
s => System.Diagnostics.Debug.WriteLine(s);
那代表
void LogMethod(string s)
{
System.Diagnostics.Debug.WriteLine(s);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.