Multicast Delegates 的返回类型必须为 void 否则会抛出异常。
我想知道它背后的原因是什么,如果多个方法可以具有与委托相同的返回类型怎么办?
Multicast Delegates 的返回类型必须为 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#。
以下答案实际上是错误的,因为您目前*可以*拥有具有非 void 返回类型的多播委托(关于这是否一直如此,尚无定论)。但是,它确实回答了“为什么一种语言不允许这样的代表?”这个问题,所以为了完整起见,我将其保留。
现在去投票给马克。
因为多个方法会返回多个值,那么委托的一个返回值应该是什么呢?显然,没有任何答案可以在所有情况下都令人满意。您可以争辩说多播委托应该:
在多播中,问题是它覆盖所有值,如果它具有返回类型,则只打印最后一个方法值,因此您必须逐个捕获返回类型,让我们看看下面的代码
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(); ;
}
}