C#委托只写出最后一个方法

时间:2017-04-25 12:19:22

标签: c# methods delegates

我有这段代码:

public void myMethod()
{
    int a = 10;
    int b = 20;
    Func<int, int, int> multiplyDelegate;
    multiplyDelegate = Multiply;
    multiplyDelegate += Multiply2;

    Console.WriteLine(multiplyDelegate(a,b));
}

public int Multiply(int x, int y)
{
    return x * y;
}
public int Multiply2(int x, int y)
{
    return x * y + 10;
}

通过运行myMethod,我希望控制台显示两个方法“Multiply”和“Multiply2”的返回值,但只显示方法“Multiply2”的返回值。我在这里做错了什么,或者我误解了代表的概念?据我所知,委托是一系列对方法的引用。

4 个答案:

答案 0 :(得分:12)

来自Using Delegates (C# Programming Guide)

  

如果委托具有返回值和/或输出参数,则返回   调用的最后一个方法的返回值和参数。

答案 1 :(得分:4)

你是对的委托可以存储方法并一次调用多个方法。除非您明确调用它们,否则它将返回最后一个。

使用您的代码,以下是所有方法集的明确调用的示例。

var results = multiplyDelegate.GetInvocationList().Select(x => (int)x.DynamicInvoke(10, 20));
foreach (var result in results)
    Console.WriteLine(result);

编辑:

这适用于功能Func而非Action。这是一个例子,假设它是Action

foreach (Delegate action in multiplyDelegate.GetInvocationList())
{
    action.DynamicInvoke(10, 20);
    // Do Something
}

此第二个示例也适用于Func

答案 2 :(得分:1)

只能返回一个对象,因为Multiple2是最后一个执行它,所以在控制台中输出。

没有办法改变这种状况。

你可以这样做:

public void myMethod()
        {
            int a = 10;
            int b = 20;
            Action<int, int> multiplyDelegate;
            multiplyDelegate = Multiply;
            multiplyDelegate += Multiply2;
            multiplyDelegate(10, 20);

            Console.Read(); 
        }

        public void Multiply(int x, int y)
        {
            Console.WriteLine(x * 2);
        }
        public void Multiply2(int x, int y)
        {
            Console.WriteLine(x * y + 10);
        }

答案 3 :(得分:1)

我没有任何官方消息来源,但我认为发生的事情是你不能从一个委托调用中返回两个值。因此,使用返回的最后一个值。

虽然只使用了最后一个返回值,但确实执行了这两个方法。我们可以在返回之前打印一些东西来证明这一点:

public int Multiply(int x, int y)
{
    Console.WriteLine("Hello1");
    return x * y;
}
public int Multiply2(int x, int y)
{
    Console.WriteLine("Hello2");
    return x * y + 10;
}

打印Hello1和Hello2。