C# Func委托不';t链法

C# Func委托不';t链法,c#,delegates,func,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: "

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

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();
}

那么,为什么不调用Add方法呢?我希望调用方法Add,然后方法Sub.

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();
}
由于无法访问而没有链接的是Add方法的结果。在链接的情况下,返回值的委托返回调用的最后一个方法的值,即添加到委托的最后一个方法

本规范第15.4部分对此进行了规定

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


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

调用具有返回值的委托时,只有最后执行的委托才会向调用代码返回值。在这种情况下,首先调用的
Add
的返回值被随后执行的
Sub
委托丢弃。
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