2012-09-21 86 views

回答

25

的前提是错误的;它工作正常:

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` 

这就是说:从MulticastDelegateFunc<T>继承。基本上,所有意图和目的,所有代表在.NET中的多路广播委托。您可能能够获得托管C++非多播委托,我不知道。但肯定不是来自C#。

+0

。它总是这样工作吗?我可以想象的东西... – Jon

+0

@Jon从内存中,这可能是.NET 1.0和.NET 1.1之间的一个重大变化 –

+0

谢谢马克......它已经帮助...... – samj28

5

以下答案实际上是错误的,因为您目前*可以*拥有带非无效返回类型的多播委托(关于这是否始终如此,陪审团仍然没有决定)。然而,它确实回答了“为什么一种语言不允许这样的代表?”这个问题,所以我为了完整性而离开它。

现在去,并给予好评马克。


由于多种方法将返回多个值,所以什么都要委托的一个返回值是呢?很明显,在任何情况下都没有令人满意的答案。你可以说,多播委托应该:

  • 回报在调用顺序的第一种方法的价值(但IIRC调用顺序是不确定的,所以如何将这项工作?)的最后一个方法
  • 的价值回归,如上所述
  • 返回由所有代表返回的单个不同值;抛出一个异常,如果不是所有的人都同意
+0

需要注意的是* .NET中的所有*代表都是多投代表。 –

+0

@DanielHilgarth:你指的是类名和它支持的功能吗?如果是这样,那么在技术上你是正确的,但“所有代表都是多播的”会留下错误的印象。显然你*可以*拥有非空的返回类型的委托,这需要和你的陈述一致。 – Jon

+0

查看回答Marc。这正是我的意思。 –

2

组播的问题是,它覆盖所有值只是打印的最后一个方法值,如果它有返回类型,所以你必须通过一个捕捉到一个的返回类型,让我们看看下面的代码

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(); ; 
    } 
} 
相关问题