【问题标题】:Delegates and Predicate enquiry代表和谓词查询
【发布时间】:2016-03-10 22:02:15
【问题描述】:

我正在学习 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);

这是因为它是谓词吗?

【问题讨论】:

标签: c# .net lambda delegates


【解决方案1】:

委托说参数可以是任何类型。当有人调用该方法时,他们可以传入 Lion、Tiger、Bear(哦,我的!!!)或任何他们想要的东西,而您的方法需要能够处理它。

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

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

【讨论】:

    【解决方案2】:

    您正在尝试将采用Employee 的方法组传递给采用object 的委托。这是不允许的,因为委托的用户可以传递object,而委托需要Employee

    以下是您可以解决的方法:

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

    Demo.

    【讨论】:

      猜你喜欢
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多