Func委托不链接方法

Dar*_*usz 11 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();
}
Run Code Online (Sandbox Code Playgroud)

该计划的结果是:

Sub: 0
Run Code Online (Sandbox Code Playgroud)

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

SWe*_*eko 15

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();
}
Run Code Online (Sandbox Code Playgroud)

它是:

Inside Add
Inside Sub
Sub: 0
Run Code Online (Sandbox Code Playgroud)

什么没有链接,因为无法访问它,是Add方法的结果.在链接的情况下,返回值的代理返回调用的最后一个方法的值,这是添加到委托的最后一个方法.

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

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