[英]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#。
以下答案實際上是錯誤的,因為您當前*可以*使用具有非無效返回類型的多播委托(對於是否一直如此,尚無定論)。 但是,它的確回答了“為什么一種語言不能禁止這樣的代表?”這個問題,因此為了完整起見,我將其保留。
現在去投票支持馬克。
因為多個方法將返回多個值,所以委托的一個返回值應該是什么? 顯然,在所有情況下都沒有令人滿意的答案。 您可能會爭辯說多播委托應該:
在多播中,問題在於它覆蓋了所有值,如果具有返回類型,則僅打印最后一個方法值,因此您必須一個接一個地捕獲返回類型,請參見下面的代碼
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.