11

我的问题在以下代码中有详细说明 - 我问这个的原因是我正在尝试代表:

//create the delegate          
delegate int del(int x);

class Program {


    static void Main(string[] args) {

        Program p;
        p = new Program();

        del d = p.a;
        d += p.b;
        d += p.c;
        d += p.d;
        d += p.e;
        Console.WriteLine(d(10)); //<<was hoping it would be 10+2+3+4+5+6

        Console.WriteLine("press [enter] to exit");
        Console.ReadLine();
    }

    private int a(int x) { Console.WriteLine("a is called"); return x + 2; }
    private int b(int x) { Console.WriteLine("b is called"); return x + 3; }
    private int c(int x) { Console.WriteLine("c is called"); return x + 4; }
    private int d(int x) { Console.WriteLine("d is called"); return x + 5; }
    private int e(int x) { Console.WriteLine("e is called"); return x + 6; }

} 

16 被退回....

在此处输入图像描述

所有函数都会触发,因为各种消息“被调用”等都被打印到console但只返回从最后一个函数e返回的数量 - 我假设在后台它们被返回但随后被覆盖?

4

2 回答 2

15

当您在问题中有一个多播委托d,返回值是.d

一般来说,对于多播委托,使用返回类型是最自然的void

编译器没有机会猜到您所希望的10+2+3+4+5+6. 你没有在任何地方指定它。

您可以将您的委托类型更改为:

delegate void del(int xToAdd, ref int sum);

a例如,您的方法应该如下所示:

private void a(int x, ref int sum) { Console.WriteLine("a is called"); sum += x + 2; }

d然后将像这样调用多播委托实例:

int sum = 0;
d(10, ref sum);
Console.WriteLine(sum);

我希望这有帮助。

于 2013-03-05T15:51:52.120 回答
9

这不是为委托处理返回类型的方式。将会发生的是所有的处理程序将彼此独立地执行,然后随机选择一个(技术上它是最后订阅的处理程序,但你不应该依赖它)返回给调用者调用了委托。

我强烈建议您不要使用具有返回值的事件(您将此委托视为事件)。这种行为实际上是不可取的。如果你想要一个返回值,确保你的委托总是映射到一个函数是有意义的,不多也不少。

至于实际生成所需的结果,虽然有多种方法,但使用更传统的代表集合会更好:

List<Func<int, int>> functions = new List<Func<int, int>>();
//populate

int result = functions.Aggregate(10, (total, func) => func(total));
于 2013-03-05T15:47:30.280 回答