代表和谓词查询

时间:2016-03-10 22:02:15

标签: 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 > _age;
    }
}

当我尝试这样做时:

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

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

public delegate bool AgeExclusion(object person);

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

2 个答案:

答案 0 :(得分:2)

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

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

现在如果类型被颠倒了,那就没问题了。如果委托说它可以接受只接受Employee作为参数的方法,那么你可以给它一个能够将任何作为参数的方法,因为毕竟,它将传递给它的所有员工都是可以接受任何的方法的有效参数。技术术语是相反的。

答案 1 :(得分:1)

您正在尝试传递一个方法组,该方法组对Employee的委托传递object。这是不允许的,因为委托的用户可以通过object,而委托期望Employee

以下是解决问题的方法:

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

Demo.