簡體   English   中英

這條線是什么? X = Y => Z(Y)

[英]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> ,這是一個委托類型。

查看MSDN上的屬性

請參閱MSDN上的操作<T>

在MSDN上見代表

在MSDN上查看lamda

因此,當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.

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