为什么输出是5?

为什么输出是5?

问题描述:

我想添加2个更多的功能给我的委托,但它似乎不处理我添加的功能。按照计划产出5.我期待10.为什么会出现这种情况?为什么输出是5?

using System; 

namespace abc 
{ 
public delegate int Del(int k); 

class Class1 
{ 
    public int Add2(int value) 
    { 
     return value = value + 2; 
    } 

    public int Add3(int value) 
    { 
     return value = value + 3; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Class1 c = new Class1(); 
     Del mydel = c.Add2; 
     mydel += c.Add3; 
     mydel += c.Add2; 

     Console.WriteLine(mydel(3)); 
     Console.ReadLine(); 
    } 
} 
} 
+0

'mydel(3)'实际上并没有改变参数的值,所以你得到最后一个函数的结果是'Add2(3)'这是3 + 2,所以5 – Rafalon

当你调用mydel(3)情况是这样的:

  1. Add2(3)被调用。这返回3 + 2 = 5,其返回值被丢弃。
  2. Add3(3)被调用。这返回3 + 3 = 6,返回值 被丢弃。
  3. Add2(3)被调用。这返回3 + 2 = 5,其返回值被打印。

当您链接委托时,其中一个的返回值不作为参数传递给链接的参数。

请注意,代表是按LIFO顺序调用的。

如果您想了解如何使用代表实际将功能链接在一起,see this thread

另外,按照链接的答案(以及由Toskr在下面的评论中提到的),你可以使用GetInvocationList()DynamicInvoke()到链中的方法一起使用,但是这是一件非常不寻常的事情:

static void Main() 
{ 
    Class1 c = new Class1(); 
    Del mydel = c.Add2; 
    mydel += c.Add3; 
    mydel += c.Add2; 

    int result = 3; 

    foreach (var func in mydel.GetInvocationList()) 
    { 
     result = (int)func.DynamicInvoke(result); 
    } 

    Console.WriteLine(result); 
} 
+0

击败了它,我是通过大致这一半:) – BugFinder

+1

也忘了第一次调用'Add2(3)',最后也是'Add2(3)'而不是'Add3(2)'。 – Rafalon

+0

是否可以保存输出并在下次调用时使用它? – Lyrk