代表和谓词查询

我正在学习lambdas,而我正在努力理解为什么,同时拥有EmployeeFilterAge类,如下所示:

public class EmployeeFilterAge { int _age; public EmployeeFilterAge(int age) { _age = age; } public bool OlderThan(Employee employee) { return employee._age > _age; } } 

当我想要这样做时:

 var filterByAge = new EmployeeFilterAge(29); var del = new AgeExclusion(filterByAge.OlderThan); 

我得到一个错误,说“没有重载方法…匹配委托…”,而委托看起来像这样:

 public delegate bool AgeExclusion(object person); 

这是因为它是一个谓词吗?

代表说该参数可以是任何类型。 当有人调用这种方法时,他们可以通过狮子,老虎,熊(哦,我的!!!)或其他任何他们想要的东西传递,你的方法需要能够处理它。

您正在尝试分配一个只能接受Employee ,并且不允许接受任何其他类型作为参数,因此显然它不是分配给该委托类型的变量的有效方法。

现在,如果类型被颠倒,那就没问题了。 如果委托说它可以接受一个只接受Employee作为参数的方法,那么你可以给它一个方法,可以把任何东西作为一个参数,因为毕竟,它将通过它的所有员工将是一个可以接受任何东西的方法的有效参数。 对此的技术术语是逆转。

您正在尝试传递一个方法组,该方法组将Employee作为接受object的委托。 这是不允许的,因为委托的用户被允许传递一个object ,而委托期望一个Employee

以下是如何解决它:

 AgeExclusion del = e => filterByAge.OlderThan((Employee)e); 

演示。