2010-06-25 28 views
3

什麼之間的#1和#2的區別:返回值((MethodInvoker)代表{/ * ... * /};我需要做一些解釋

代碼1(編譯OK):

 byte[] GetSomeBytes() 
    { 
      return (byte[])this.Invoke((MethodInvoker)delegate 
      { 
       GetBytes(); 
      }); 
    } 

    byte[] GetBytes() 
    { 
    GetBytesForm gbf = new GetBytesForm(); 

    if(gbf.ShowDialog() == DialogResult.OK) 
    { 
    return gbf.Bytes; 
    } 
    else 
    return null; 
    } 

代碼2(未遵守OK)

int GetCount() 
{ 
     return (int)this.Invoke((MethodInvoker)delegate 
     { 
      return 3;    
     }); 
} 

代碼#2給我由於 'System.Windows.Forms.MethodInvoker' 返回void,返回關鍵字一定不能跟一個對象表達式

我該如何解決?爲什麼(做)編譯器認爲代碼#1是正確的?

+0

我們能有更多一點的代碼。 「this」指的是什麼類型? – 2010-06-25 12:35:07

+0

@Matthew,Windows窗體。 – 2010-06-25 12:41:57

回答

22

要回答你的第一個問題,嘗試改變你的第一個樣品是這樣的:

return (byte[])this.Invoke((MethodInvoker)delegate 
{ 
    return GetBytes(); 
}); 

在這一點上,你將有相同的編譯錯誤。

public object Invoke(Delegate method)返回一個對象,這樣你就可以返回值轉換爲任何東西,它會編譯。但是,您正在傳入MethodInvoker類型的代理,該代理的簽名爲delegate void MethodInvoker()。因此,在您投入MethodInvoker的方法體內,您不能使用return任何東西。

試試這個對於第二個:

return (int)this.Invoke((Func<int>)delegate 
{ 
    return 3; 
}); 

Func<int>是返回一個int代表,所以它會編譯。

+0

謝謝,威爾。我標記你的答案是有用的。 – 2010-06-25 12:45:20

1

代碼#1,你的委託不返回值 - 它只是執行GetBytes會(),但不返回任何東西。編譯器不會抱怨,因爲它不期望返回值(這是一個無效的方法)。

然而,代碼#2你試圖返回從委託的值 - 這是編譯器的抱怨,因爲你不能(在這種情況下,「3」)從一個void方法返回一個值。

+0

呵呵,我混淆了兩個回報。我忘了添加返回到GetBytes(); – 2010-06-25 12:47:16