【问题标题】:Func delegate doesn't chain methodsFunc 委托不链接方法
【发布时间】:2013-01-22 16:32:40
【问题描述】:

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

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。

【问题讨论】:

  • 当调用一个有返回值的委托时,只有最后执行的委托返回一个值给调用代码。在这种情况下,首先调用的Add 的返回值被随后执行的Sub 委托丢弃。

标签: c# delegates func


【解决方案1】:

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 language specification 的第 15.4 部分中指定

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多