Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 委托和谓词查询_C#_.net_Lambda_Delegates - Fatal编程技术网

C# 委托和谓词查询

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 >

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

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

委托表示参数可以是任何类型。当有人调用该方法时,他们可以传入一只狮子、一只老虎、一只熊(哦,天哪!!!),或者他们想要的任何东西,并且您的方法需要能够处理它

您试图分配的方法只能接受
员工
,并且不允许接受任何其他类型作为参数,因此分配给该委托类型的变量显然不是有效的方法


现在,如果类型颠倒,那就好了。如果代理说它可以接受一个只接受
员工
作为参数的方法,那么您可以给它一个可以接受任何内容作为参数的方法,因为毕竟,它将传递它的所有员工都是可以接受任何内容的方法的有效参数。技术术语是逆变。

代表说参数可以是任何类型。当有人调用该方法时,他们可以传入一只狮子、一只老虎、一只熊(哦,天哪!!!),或者他们想要的任何东西,并且您的方法需要能够处理它

您试图分配的方法只能接受
员工
,并且不允许接受任何其他类型作为参数,因此分配给该委托类型的变量显然不是有效的方法


现在,如果类型颠倒,那就好了。如果代理说它可以接受一个只接受
员工
作为参数的方法,那么您可以给它一个可以接受任何内容作为参数的方法,因为毕竟,它将传递它的所有员工都是可以接受任何内容的方法的有效参数。这方面的技术术语是逆变。

您试图为接受对象的代理传递接受员工的方法组。这是不允许的,因为允许代理的用户传递
对象
,而代理需要
员工

以下是您可以修复它的方法:

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

您正试图为接受
对象的委托传递接受
员工的方法组。这是不允许的,因为允许代理的用户传递
对象
,而代理需要
员工

以下是您可以修复它的方法:

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

供参考,.供参考。