2017-04-25 27 views
4

我有這樣的代碼:C#代表只寫出最後一個方法

public void myMethod() 
{ 
    int a = 10; 
    int b = 20; 
    Func<int, int, int> multiplyDelegate; 
    multiplyDelegate = Multiply; 
    multiplyDelegate += Multiply2; 

    Console.WriteLine(multiplyDelegate(a,b)); 
} 

public int Multiply(int x, int y) 
{ 
    return x * y; 
} 
public int Multiply2(int x, int y) 
{ 
    return x * y + 10; 
} 

通過運行myMethod的,我希望控制檯顯示來自兩種方法的「乘法」和「Multiply2」,但只有從返回的回報顯示方法「Multiply2」。我在這裏做錯了什麼,或者我誤解了代表的概念?從我學到的一個委託是一個方法的引用數組。

+0

它同時呼籲,但它不寫都 – WhileTrueSleep

回答

4

你是對的代表可以存儲方法並一次調用多個方法。它會返回最後一個,除非你明確地調用它們。

使用你的代碼,這裏是所有的方法收集的explicite調用的一個例子。

var results = multiplyDelegate.GetInvocationList().Select(x => (int)x.DynamicInvoke(10, 20)); 
foreach (var result in results) 
    Console.WriteLine(result); 

編輯:

這將爲功能Func,而不是Action工作。下面是一個例子假設它是FuncAction

foreach (Delegate action in multiplyDelegate.GetInvocationList()) 
{ 
    action.DynamicInvoke(10, 20); 
    // Do Something 
} 

第二個例子正常工作。

+0

謝謝LostBlue,這讓它:) –

1

只能返回一個對象,因爲Multiple2是最後一個執行get的控制檯輸出。

沒有辦法改變這種情況。

你可以這樣做:

public void myMethod() 
     { 
      int a = 10; 
      int b = 20; 
      Action<int, int> multiplyDelegate; 
      multiplyDelegate = Multiply; 
      multiplyDelegate += Multiply2; 
      multiplyDelegate(10, 20); 

      Console.Read(); 
     } 

     public void Multiply(int x, int y) 
     { 
      Console.WriteLine(x * 2); 
     } 
     public void Multiply2(int x, int y) 
     { 
      Console.WriteLine(x * y + 10); 
     } 
1

我沒有這方面的任何官方消息,但我認爲正在發生的事情是,你不能從一個委託調用返回兩個值。因此,使用返回的最後一個值。

雖然只使用了最後一個返回值,這兩種方法確實執行。

public int Multiply(int x, int y) 
{ 
    Console.WriteLine("Hello1"); 
    return x * y; 
} 
public int Multiply2(int x, int y) 
{ 
    Console.WriteLine("Hello2"); 
    return x * y + 10; 
} 

兩個Hello1和Hello2印:之前我們回到我們可以打印一些東西證明了這一點。

+0

我複製你的代碼到我的文檔,只有Hello2和190在我的控制檯中顯示。 –

+0

@RobinCox我在csharppad.com上試了一下,它顯示了Hello1和Hello2。也許這是C#6的新行爲,並且您正在使用C#5?看到這個; http://csharppad.com/gist/d0a0c42badee28aa3e908376cd6e7fb5 – Sweeper

+0

這很奇怪,因爲我有Visual Studio 2017 –

相關問題