C# 委托和谓词查询
我正在学习lambdas,我正在试图理解为什么,而EmployeeFilterAge课程是这样的:C# 委托和谓词查询,c#,.net,lambda,delegates,C#,.net,Lambda,Delegates,我正在学习lambdas,我正在试图理解为什么,而EmployeeFilterAge课程是这样的: public class EmployeeFilterAge { int _age; public EmployeeFilterAge(int age) { _age = age; } public bool OlderThan(Employee employee) { return employee._age >
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);
这是因为它是一个谓词吗?委托表示参数可以是任何类型。当有人调用该方法时,他们可以传入一只狮子、一只老虎、一只熊(哦,天哪!!!),或者他们想要的任何东西,并且您的方法需要能够处理它 您试图分配的方法只能接受
员工
,并且不允许接受任何其他类型作为参数,因此分配给该委托类型的变量显然不是有效的方法
现在,如果类型颠倒,那就好了。如果代理说它可以接受一个只接受
员工
作为参数的方法,那么您可以给它一个可以接受任何内容作为参数的方法,因为毕竟,它将传递它的所有员工都是可以接受任何内容的方法的有效参数。技术术语是逆变。代表说参数可以是任何类型。当有人调用该方法时,他们可以传入一只狮子、一只老虎、一只熊(哦,天哪!!!),或者他们想要的任何东西,并且您的方法需要能够处理它
您试图分配的方法只能接受员工
,并且不允许接受任何其他类型作为参数,因此分配给该委托类型的变量显然不是有效的方法
现在,如果类型颠倒,那就好了。如果代理说它可以接受一个只接受
员工
作为参数的方法,那么您可以给它一个可以接受任何内容作为参数的方法,因为毕竟,它将传递它的所有员工都是可以接受任何内容的方法的有效参数。这方面的技术术语是逆变。您试图为接受对象的代理传递接受员工的方法组。这是不允许的,因为允许代理的用户传递对象
,而代理需要员工
以下是您可以修复它的方法:
AgeExclusion del = e => filterByAge.OlderThan((Employee)e);
您正试图为接受
对象的委托传递接受员工的方法组。这是不允许的,因为允许代理的用户传递对象
,而代理需要员工
以下是您可以修复它的方法:
AgeExclusion del = e => filterByAge.OlderThan((Employee)e);
供参考,.供参考。