代表可以合并,所以:
MethodInvoker del = delegate { Console.WriteLine("Delegate 1"); };
del += delegate { Console.WriteLine("Delegate 2"); };
del.Invoke();
Run Code Online (Sandbox Code Playgroud)
输出:
Delegate 1
Delegate 2
Run Code Online (Sandbox Code Playgroud)
既然它调用了两种方法,我试着看它是否会起作用:
Func<Person, bool> filters = person => person.Name.Contains("John");
filters += person => person.Age >= 18;
List<Person> persons = getPersons();
persons.Where(filters);
Run Code Online (Sandbox Code Playgroud)
但它没有,只有最后应用(在这种情况下 person => person.Age >= 18
).
我的问题是:为什么不呢?有可能实现这个吗?(并不是说我会重写Linq的扩展方法只是为了实现它,但如果可能的话会很酷)
注意: 我知道在LINQ to Objects中,执行此操作会类似,因为执行是延迟的:
persons.Where( x => x.Name.Contains( nameFilter )).Where( x => x.Age >= 18 );
Run Code Online (Sandbox Code Playgroud)
但这不是我感兴趣的.
原因是两个过滤器都被执行,但只使用了最后一个委托的返回值.这就是代表们按照规范工作的方式.就像评论所说,我无法想象这将如何以不同的方式起作用.你暗示结果应该是AND
ed,但为什么不能OR
编辑?如果结果是什么会发生什么strings
?