簡體   English   中英

多播代表的返回類型必須為void。 為什么?

[英]Multicast Delegates must have a return type of void. Why?

多播代表的返回類型必須為void,否則將引發異常。

我想知道其背后的原因是什么,如果多個方法可能具有與委托相同的返回類型,該怎么辦?

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

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

那是一個沒有無效結果的多播委托,可以正常工作。 您可以從控制台中看到兩個部分均已執行。 最后一項的結果是返回的結果。 我們可以證明這是一個真正的多播委托:

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`

也就是說: Func<T>繼承自MulticastDelegate 基本上,就所有意圖和目的而言,.NET中的所有委托都是多播委托。 我不知道,您也許可以在托管C ++中獲得非多播委托。 但是肯定不是來自C#。

以下答案實際上是錯誤的,因為您當前*可以*使用具有非無效返回類型的多播委托(對於是否一直如此,尚無定論)。 但是,它的確回答了“為什么一種語言不能禁止這樣的代表?”這個問題,因此為了完整起見,我將其保留。

現在去投票支持馬克。


因為多個方法將返回多個值,所以委托的一個返回值應該是什么? 顯然,在所有情況下都沒有令人滿意的答案。 您可能會爭辯說多播委托應該:

  • 以調用順序返回第一個方法的值(但是未指定IIRC調用順序,那么它將如何工作?)
  • 返回上一個方法的值,如上所述
  • 返回所有代表返回的唯一值; 如果不是所有人都同意,則拋出異常

在多播中,問題在於它覆蓋了所有值,如果具有返回類型,則僅打印最后一個方法值,因此您必須一個接一個地捕獲返回類型,請參見下面的代碼

 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(); ;
    }
}

暫無
暫無

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

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