回答
的前提是错误的;它工作正常:
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`
这就是说:从MulticastDelegate
Func<T>
继承。基本上,所有意图和目的,所有代表在.NET中的多路广播委托。您可能能够获得托管C++非多播委托,我不知道。但肯定不是来自C#。
以下答案实际上是错误的,因为您目前*可以*拥有带非无效返回类型的多播委托(关于这是否始终如此,陪审团仍然没有决定)。然而,它确实回答了“为什么一种语言不允许这样的代表?”这个问题,所以我为了完整性而离开它。
现在去,并给予好评马克。
由于多种方法将返回多个值,所以什么都要委托的一个返回值是呢?很明显,在任何情况下都没有令人满意的答案。你可以说,多播委托应该:
- 回报在调用顺序的第一种方法的价值(但IIRC调用顺序是不确定的,所以如何将这项工作?)的最后一个方法
- 的价值回归,如上所述
- 返回由所有代表返回的单个不同值;抛出一个异常,如果不是所有的人都同意
需要注意的是* .NET中的所有*代表都是多投代表。 –
@DanielHilgarth:你指的是类名和它支持的功能吗?如果是这样,那么在技术上你是正确的,但“所有代表都是多播的”会留下错误的印象。显然你*可以*拥有非空的返回类型的委托,这需要和你的陈述一致。 – Jon
查看回答Marc。这正是我的意思。 –
组播的问题是,它覆盖所有值只是打印的最后一个方法值,如果它有返回类型,所以你必须通过一个捕捉到一个的返回类型,让我们看看下面的代码
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(); ;
}
}
- 1. 委托消息是否有必要始终具有void作为返回类型?
- 2. 匿名委托可以返回值为非void类型吗?
- 3. 怎么找出委托返回void?
- 4. 委托的返回类型
- 5. 返回类型为void的方法返回的是什么?
- 6. 为什么我必须导入我的委托头文件?
- 7. 为什么委托必须是静态的?
- 8. 为什么部分方法只能有void返回类型?
- 9. 方法必须具有返回类型WCF服务
- 10. C# - 方法必须具有返回类型
- 11. 问题与委托返回类型
- 12. 为什么WinRT类型必须密封?
- 13. 不返回值,从函数具有非void返回类型
- 14. 为什么返回类型void在.NET中声明为struct?
- 15. C#/委托不具有类型参数
- 16. 为什么不能使用具有多态返回类型的基本类型?
- 17. 重载方法必须具有相同的返回类型(或子类型)吗?
- 18. 表达式必须具有类类型?
- 19. 为什么委托类型是从MulticastDelegate类派生的,为什么不直接从委托类派生?
- 20. 为什么必须有一个委托来桥接线程及其方法?
- 21. 为什么实体类必须有@Id?
- 22. 多播委托Ambigous
- 23. 委托人返回为UsernamePasswordAuthenticationToken
- 24. 为什么固定宽度类型会委托回原始类型?
- 25. 为什么Window.open()的返回类型是void?
- 26. Java - 为什么Eclipse告诉我我的方法必须返回int类型?
- 27. 为什么C++中的Lambda函数0x返回类型必须是auto?
- 28. 为什么我收到错误“此方法必须返回类型...的结果?”?
- 29. 具有多种返回类型的类?
- 30. 为什么委托人在作为财产使用时必须公开?
你能举一个例子来说明它抛出异常吗? –