让我们想象一下简单的委托调用:
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。
答案 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的返回丢失了。