2012-10-18 49 views
3

我不能直接通過一個lambda拉姆達表達式是一個委託嗎?

form.Invoke(() => AMethod(form)); 

由於奇怪的拉姆達不是委託型(每編譯器錯誤)。我似乎記得Jon Skeet的.NET 4.0書中的不同信息。而就MSDN它說:

A lambda expression is an anonymous function that you can use to create delegates or expression tree types

public static void Main() 
    { 
     Form form = new Form();         
     form.Show(); 
     form.Invoke(() => AMethod(form)); 
     Application.Run(); 

     Console.Read(); 
    } 

    public static void AMethod(Form form) 
    { 
     form.SendToBack(); 
    } 
} 

然而,在這裏,我們收到一個編譯器錯誤:

Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type.

拉姆達的應該是對匿名委託語法糖。那麼這裏的故事是什麼?我錯過了什麼?

+0

BTW,除了下面的答案,隨意創建,它接受一個'Action'委託類型,反過來包裹'Form.Invoke'方法的擴展方法。這樣你就可以擁有上面的好語法,而不必每次都明確地施放/構造一個「Action」。 –

+1

我相信我也有一種微妙之處。代表關鍵字和代表類型之間有區別。 –

+1

'delegate'關鍵字定義了一個新的'MulticastDelegate'子類。例如:'Action:MulticastDelegate:Delegate:Object'。 'Delegate'大寫字母的類型是'System.Delegate'。只是爲了讓事情變得有趣,我們經常交換委託(關鍵字),委託(類型)和委託(概念):)儘管通常,如果您看到「委託」大寫,它是參考'System.Delegate'類型,但並非總是如此。 –

回答

3

是,lambda表達式用來創建代表,但他們沒有自己的代表。這裏的主要問題是lambda沒有簽名,它們的參數列表和返回類型是根據它們放置的上下文來確定的。當您將lambda放在需要特定的定義的委託實例的地方時,編譯器知道什麼lambda必須匹配才能生效。

Invoke另一方面不採取一些特定的委託類型,它需要一個Delegate沒有任何簽名的實例。您需要將您的lambda包裝在new SomeActualDelegateType(...)Action是此處某個代表的常見選擇,但不是唯一選擇)以給它一個實際簽名。

5

Lambda本身不是代表。但是,就像你引用的文字,它們可以被用來創建代表:

form.Invoke(new Action(() => AMethod(form))); 
0

嘗試創建行動:form.Invoke(new Action(() => MyMethod(form)));