2012-09-21 138 views

回答

25

的前提是錯誤的;它工作正常:

Func<int> func = delegate { Console.WriteLine("first part"); return 5; }; 
func += delegate { Console.WriteLine("second part"); return 7; }; 
int result = func(); 

這是一個非空結果的多播委託,做工精細。您可以從控制檯看到兩個部分都已執行。 last item的結果是返回的結果。我們可以證明,這是一個真正的多播委託:

if(func is MulticastDelegate) Console.WriteLine("I'm multicast"); 

,它會寫「我播」 甚至只是第一線後(當只有上市一個方法)。

如果您需要在單獨的結果更多的控制權,然後使用GetInvocationList()

foreach (Func<int> part in func.GetInvocationList()) 
{ 
    int result = part(); 
} 

它可以讓你看到每個人的結果。

在IL術語:

.class public auto ansi sealed Func<+ TResult> 
    extends System.MulticastDelegate` 

這就是說:從MulticastDelegateFunc<T>繼承。基本上,所有意圖和目的,所有代表在.NET中的多路廣播委託。您可能能夠獲得託管C++非多播委託,我不知道。但肯定不是來自C#。

+0

。它總是這樣工作嗎?我可以想象的東西... – Jon

+0

@Jon從內存中,這可能是.NET 1.0和.NET 1.1之間的一個重大變化 –

+0

謝謝馬克......它已經幫助...... – samj28

5

以下答案實際上是錯誤的,因爲您目前*可以*擁有帶非無效返回類型的多播委託(關於這是否始終如此,陪審團仍然沒有決定)。然而,它確實回答了「爲什麼一種語言不允許這樣的代表?」這個問題,所以我爲了完整性而離開它。

現在去,並給予好評馬克。


由於多種方法將返回多個值,所以什麼都要委託的一個返回值是呢?很明顯,在任何情況下都沒有令人滿意的答案。你可以說,多播委託應該:

  • 回報在調用順序的第一種方法的價值(但IIRC調用順序是不確定的,所以如何將這項工作?)的最後一個方法
  • 的價值迴歸,如上所述
  • 返回由所有代表返回的單個不同值;拋出一個異常,如果不是所有的人都同意
+0

需要注意的是* .NET中的所有*代表都是多投代表。 –

+0

@DanielHilgarth:你指的是類名和它支持的功能嗎?如果是這樣,那麼在技術上你是正確的,但「所有代表都是多播的」會留下錯誤的印象。顯然你*可以*擁有非空的返回類型的委託,這需要和你的陳述一致。 – Jon

+0

查看回答Marc。這正是我的意思。 –

2

組播的問題是,它覆蓋所有值只是打印的最後一個方法值,如果它有返回類型,所以你必須通過一個捕捉到一個的返回類型,讓我們看看下面的代碼

class Program 
{ 
    // i am going to add and subtract two num but i wanna get result in string the same thing you can do for int and what ever you want 
     delegate string mydeledagte(int a,int b); 
     delegate string d(int s, int t); 
    static void Main(string[] args) 
    { 
     mydeledagte ab = new mydeledagte(ad); 
     mydeledagte d= new mydeledagte(sub); 
     mydeledagte multi = ab + d; 

     foreach (mydeledagte individualMI in multi.GetInvocationList()) 
     { 
      string retVal = individualMI(3, 5); 
      Console.WriteLine("Output: " + retVal); 
      Console.WriteLine("\n***developer of KUST***"); 
      Console.ReadKey(); 
     } 
    } 
    static string ad(int a, int b) 
    { 

     return (a + b).ToString(); 

    } 
    static string sub(int a, int b) 
    { 

     return (a - b).ToString(); ; 
    } 
} 
相關問題