sam*_*j28 7 c# delegates multicastdelegate
多播代理必须具有返回类型void否则将引发异常.
我想知道它背后的原因是什么,如果多个方法可以具有与委托相同的返回类型呢?
Mar*_*ell 30
前提是错误的; 它工作正常:
Func<int> func = delegate { Console.WriteLine("first part"); return 5; };
func += delegate { Console.WriteLine("second part"); return 7; };
int result = func();
Run Code Online (Sandbox Code Playgroud)
这是一个带有非void结果的多播委托,工作正常.您可以从控制台看到两个部分都已执行.最后一项的结果是返回的结果.我们可以证明这是一个真正的多播委托:
if(func is MulticastDelegate) Console.WriteLine("I'm multicast");
Run Code Online (Sandbox Code Playgroud)
即使只在第一行(当只列出一种方法时),它也会写"我是多播" .
如果您需要更多地控制个别结果,请使用GetInvocationList():
foreach (Func<int> part in func.GetInvocationList())
{
int result = part();
}
Run Code Online (Sandbox Code Playgroud)
它允许您查看每个单独的结果.
在IL术语中:
.class public auto ansi sealed Func<+ TResult>
extends System.MulticastDelegate`
Run Code Online (Sandbox Code Playgroud)
也就是说:Func<T>继承自MulticastDelegate.基本上,所有意图和目的,所有在.NET委托是多路广播委托.您可能能够在托管C++中获得非多播委托,我不知道.但肯定不是来自C#.
以下答案实际上是错误的,因为您目前*可以*具有非void返回类型的多播委托(陪审团仍然没有考虑这是否一直如此).但是,它确实回答了"为什么一种语言不允许这样的代表?"的问题,所以我将其留作完整性.
现在去投票马克.
因为多个方法会返回多个值,那么委托的一个返回值应该是什么呢?显然,在任何情况下都没有令人满意的答案.您可以争辩多播委托应该:
| 归档时间: |
|
| 查看次数: |
7877 次 |
| 最近记录: |