我有这段代码:
public void myMethod()
{
int a = 10;
int b = 20;
Func<int, int, int> multiplyDelegate;
multiplyDelegate = Multiply;
multiplyDelegate += Multiply2;
Console.WriteLine(multiplyDelegate(a,b));
}
public int Multiply(int x, int y)
{
return x * y;
}
public int Multiply2(int x, int y)
{
return x * y + 10;
}
通过运行myMethod,我希望控制台显示两个方法“Multiply”和“Multiply2”的返回值,但只显示方法“Multiply2”的返回值。我在这里做错了什么,或者我误解了代表的概念?据我所知,委托是一系列对方法的引用。
答案 0 :(得分:12)
来自Using Delegates (C# Programming Guide):
如果委托具有返回值和/或输出参数,则返回 调用的最后一个方法的返回值和参数。
答案 1 :(得分:4)
你是对的委托可以存储方法并一次调用多个方法。除非您明确调用它们,否则它将返回最后一个。
使用您的代码,以下是所有方法集的明确调用的示例。
var results = multiplyDelegate.GetInvocationList().Select(x => (int)x.DynamicInvoke(10, 20));
foreach (var result in results)
Console.WriteLine(result);
编辑:
这适用于功能Func
而非Action
。这是一个例子,假设它是Action
foreach (Delegate action in multiplyDelegate.GetInvocationList())
{
action.DynamicInvoke(10, 20);
// Do Something
}
此第二个示例也适用于Func
。
答案 2 :(得分:1)
只能返回一个对象,因为Multiple2是最后一个执行它,所以在控制台中输出。
没有办法改变这种状况。
你可以这样做:
public void myMethod()
{
int a = 10;
int b = 20;
Action<int, int> multiplyDelegate;
multiplyDelegate = Multiply;
multiplyDelegate += Multiply2;
multiplyDelegate(10, 20);
Console.Read();
}
public void Multiply(int x, int y)
{
Console.WriteLine(x * 2);
}
public void Multiply2(int x, int y)
{
Console.WriteLine(x * y + 10);
}
答案 3 :(得分:1)
我没有任何官方消息来源,但我认为发生的事情是你不能从一个委托调用中返回两个值。因此,使用返回的最后一个值。
虽然只使用了最后一个返回值,但确实执行了这两个方法。我们可以在返回之前打印一些东西来证明这一点:
public int Multiply(int x, int y)
{
Console.WriteLine("Hello1");
return x * y;
}
public int Multiply2(int x, int y)
{
Console.WriteLine("Hello2");
return x * y + 10;
}
打印Hello1和Hello2。