我正在学习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);
这是因为它是一个谓词吗?
答案 0 :(得分:2)
委托说该参数可以是任何类型。当有人调用这种方法时,他们可以通过狮子,老虎,熊(哦,我的!!!)或其他任何他们想要的东西传递,你的方法需要能够处理它。
您正在尝试分配一个只能接受Employee
的方法,并且不允许接受任何其他类型作为参数,所以显然它不是分配给变量的有效方法该代表类型。
现在如果类型被颠倒了,那就没问题了。如果委托说它可以接受只接受Employee
作为参数的方法,那么你可以给它一个能够将任何作为参数的方法,因为毕竟,它将传递给它的所有员工都是可以接受任何的方法的有效参数。技术术语是相反的。
答案 1 :(得分:1)
您正在尝试传递一个方法组,该方法组对Employee
的委托传递object
。这是不允许的,因为委托的用户可以通过object
,而委托期望Employee
。
以下是解决问题的方法:
AgeExclusion del = e => filterByAge.OlderThan((Employee)e);