11

让我们想象一下简单的委托调用:

void Main()
{
    Func<int, int, string> tfunc = null;
    tfunc += Add; // bind first method
    tfunc += Sub; // bind second method 

    Console.WriteLine(tfunc(2, 2));
}

private string Add(int a, int b)
{
    return "Add: " + (a + b).ToString();
}

private string Sub(int a, int b)
{
    return "Sub: " + (a - b).ToString();
}

这个程序的结果是:

Sub: 0

那么,为什么没有调用Add方法呢?我期待调用方法 Add,然后调用方法 Sub。

4

2 回答 2

16

Add被正确链接和调用,看看结果

void Main()
{
    Func<int, int, string> tfunc = null;
    tfunc += Add; // bind first method
    tfunc += Sub; // bind second method 

    Console.WriteLine(tfunc(2, 2));
}

private string Add(int a, int b)
{
    Console.WriteLine("Inside Add");
    return "Add: " + (a + b).ToString();
}

private string Sub(int a, int b)
{
    Console.WriteLine("Inside Sub");
    return "Sub: " + (a - b).ToString();
}

这是:

Inside Add
Inside Sub
Sub: 0

没有链接的,因为没有办法访问它,是 Add 方法的结果。返回值的委托,在链接的情况下,返回最后调用的方法的值,即添加到委托的最后一个方法。

这在C# 4.0 语言规范的第 15.4 部分中指定

其调用列表包含多个条目的委托实例的调用通过按顺序同步调用调用列表中的每个方法来进行。...如果委托调用包含输出参数或返回值,则它们的最终值将来自列表中最后一个委托的调用。

于 2013-01-22T16:34:51.613 回答
3

问题是在方法调用之间没有传递返回值,所以输出只捕获最后一个返回的字符串。即 Add 的返回丢失。

于 2013-01-22T16:38:10.923 回答