2014-03-28 23 views
2

昨天我遇到了這種情況,它一直在啃我。編譯器不會爲我的DoThis方法使用對函數的引用,因爲它會調用一個Action,這對我來說是一個具有'void'返回類型的委託。功能參考如何與動作不同<T>

DoThis函數的這個Action參數真的在做什麼?

public class testit 
{ 
    // Call DoThis with just a function reference. Should not work, but does. 
    public void DoThisThing1() { 
     DoThis(this.thing1); 
    } 

    // Call DoThis with an action. This is correct. 
    public void DoThisThing2() { 
     DoThis(new Action<string, string>(this.thing2)); 
    } 

    private void DoThis(Action<string, string> thing) 
    { 
     // Do some common things here. 

     // Invoke Action 
     thing.Invoke("1", "2"); 

     // Do other things. 
    } 

    private void thing1(string p1, string p2){} 

    private void thing2(string p1, string p2){} 
} 
+1

問題是什麼?我很困惑。 –

+0

順便說一句,在C#中沒有「函數引用」這樣的東西; 'thing1'是*方法組*。 –

+0

我不知道該怎麼稱呼「方法組」。爲了澄清,我想知道爲什麼使用方法組而不是操作沒有給我一個編譯器錯誤或警告。 – Jpirok

回答

7

如果你的問題是,爲什麼這個工程:

DoThis(this.thing1); 

然後就是含蓄:

DoThis(new Action<string,string>(this.thing1)); 

(委託類型是從DoThis的解決方法簽名推斷)

簡單地說:編譯器爲我們填充了一些東西 - 語法糖自C#2以來就存在。在C#1.1中,它不會編譯。

+0

謝謝!這正是我所期待的。我沒想到編譯器在更改代碼時沒有通知你就有那麼多自由。我覺得DoThis(this.thing1)應該是一個編譯器錯誤,因爲我稱它錯了。我希望這至少會在編譯器警告中出現。再次感謝! – Jpirok

+0

@Jpirok它沒有*改變*任何東西 - 它增加了一些完全毫不含糊的東西,只會是噪音。 –

+0

@Jpirok:你不是說錯了,沒有歧義。感到高興的是,它少了幾次擊鍵。 – spender