簡體   English   中英

C# - 方法中的自動委托類型

[英]C# - automatic delegate type from method

有什么方法可以避免在這樣的場景中明確聲明MyMethodDelegate

bool MyMethod(string x)
{
    //...
}

BeginInvoke(new MyMethodDelegate(MyMethod), x);

我知道lambdas a-la ()=>MyMethod(x) ,但是我想有時避免它們,因為它們會破壞編輯並繼續。

編輯 :僅BeginInvoke(MyMethod, x)不起作用:

The best overloaded method match for 'System.Windows.Forms.Control.BeginInvoke(System.Delegate, params object[])' has some invalid arguments
Argument 1: cannot convert from 'method group' to 'System.Delegate'
Argument 2: cannot convert from 'string' to 'object[]'

BeginInvoke定義如下:

public IAsyncResult BeginInvoke(Delegate method, params object[] args);

它沒有指定任何特定的委托類型,因此編譯器無法檢測從BeginInvoke(MyMethod. x)實例化哪個委托類型BeginInvoke(MyMethod. x)

對於framework> = 3.5,您可以使用預定義的委托Action <>和Func <>(在您的情況下)

    BeginInvoke(new Func<int, bool>(MyMethod), x);

Func的文檔http://msdn.microsoft.com/ru-ru/library/bb549151.aspx

您經常可以使用簡化版

MyMethod

當需要代表時 關鍵字經常是。

但是,如果編譯器無法確定將方法組轉換為哪種類型的委托,則必須幫助進行顯式轉換

當您希望傳遞一個尚未定義且在代碼中的其他位置不需要的函數時,Lambdas可以派上用場。 然后,Lambda(通常是匿名函數)將非常方便,因為您可以在需要的地方簡單地定義該函數。

在BeginInvoke的情況下,你是正確的,如注釋中所述,你不能通過強制轉換或賦值將方法組顯式轉換為委托

Func<int,bool) m = MyMethod;
BeginInvoke(m,x);
BeginInvoke((Func<inte,bool>)MyMethod,x);

將編譯或你可以傳入一個lambda,因為它被解釋為一個Func

BeginInvoke(a=>MyMethod(a),x);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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