Func委托不链接方法

时间:2013-01-22 16:32:41

标签: c# delegates func

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

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

那么,为什么没有调用添加方法?我希望调用Method Add,然后然后方法Sub。

2 个答案:

答案 0 :(得分:14)

添加已正确链接并调用,请查看

的结果
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 language specification

的第15.4部分中有详细说明
  

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

答案 1 :(得分:3)

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