2016-12-29 77 views
0
  1. 是否需要使用委託關鍵字輸入所有匿名函數?例如,我們有一個Customer類,lambda表達式,C中的匿名函數代表#

    delegate(Customer a) 
    {return a.name == "Michael";} 
    

這是匿名函數

(Customer a) 
    {return a.name == "Michael";} 

一個函數或委託或兩者兼而有之?

  1. 做所有lambda表達式還默認謂詞委託?例如,我們有客戶的名單,這是listCustomers,如果我們想用TrueForAll函數來查看所有客戶是否叫「邁克爾」,我們只需鍵入如下:

    listCustomers.TrueForAll(x => x.name == "Michael); 
    

但TrueForAll需要謂語參數,因爲我們知道Predacate爲代表,這意味着「X => x.name ==‘邁克爾’也是謂詞代表默認

+0

第二碼塊不是匿名函數。事實上,這不是什麼 - 代碼不會編譯。 – Abion47

+0

對於問題#2,lambda表達式沒有類型,但如果可以推斷出委託類型,則它可以隱式轉換爲委託。在這種情況下,委託類型爲'Func '。 –

回答

2

形式匿名委託的:

// A: C# 2.0... No one uses it in new developments since years 
delegate() { } 

// B: C# 3.0 and above 
() => { } 

w ^我可以設置一個匿名代表給特定的代表嗎?

Action a1 =() => Console.WriteLine("hello world"); 
Action<int> a2 = number => Console.WriteLine(number); 
Func<bool> f1 =() => true; 

這就是所謂的委託類型推斷

總之,如果任務的右側滿足左側簽名(即委託類型),右側將作爲左側的類型進行導入。方法參數也是如此。

在另一方面,它不是比lambda語法委託相同lambda表達式:

Expression<Action> expr1 =() => Console.WriteLine("hello world"); 
Action a1 =() => Console.WriteLine("hello world"); 

首先是an expression tree,這是一個數據結構類似於可以用於抽象語法樹從epxression和它的孩子中提取信息,而後者是一個代表。

表達式樹可被編譯爲代表:

Action a2 = expr1.Compile(); 
a2(); 

進一步閱讀