Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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中谓词和Func委托的区别#_C#_.net_Delegates - Fatal编程技术网

C# C中谓词和Func委托的区别#

C# C中谓词和Func委托的区别#,c#,.net,delegates,C#,.net,Delegates,我是C#的初学者,只是一个关于C中谓词和Func委托之间区别的问题# 我们知道: public delegate bool Predicate<in T>(T obj); public delegate TResult Func<in T, out TResult>(T arg); 公共委托布尔谓词(T obj); 公共委托TResult Func(T参数); 如果我真的喜欢 Func<Product, bool> firstdelegate = ...

我是C#的初学者,只是一个关于C中谓词和Func委托之间区别的问题#

我们知道:

public delegate bool Predicate<in T>(T obj);

public delegate TResult Func<in T, out TResult>(T arg);
公共委托布尔谓词(T obj);
公共委托TResult Func(T参数);
如果我真的喜欢

Func<Product, bool> firstdelegate = ...
Func firstdelegate=。。。

谓词第二谓词=。。。
他们不一样吗?我的意思是它们都做相同的事情,那么为什么在LINQ中,Where()方法采用Func类型的委托而不是谓词呢?

是在.NET 2.0中引入泛型的。它是一个接受一个参数并返回
bool
的委托

然而,随着.NET 3.5中LINQ的引入,确定了需要两个泛型类型的族-和(区别在于它们是否返回任何内容),它们最多占用16 41个泛型输入参数,并且在它们的返回类型中是泛型的。如果
Func
首先存在,
Predicate
将永远不会首先被创建。这是一种不必要的特殊委托类型

但是,出于向后兼容性的原因,它们现在无法从框架中删除
谓词。有人可能会说它的名字确实传达了特定的语义,但我很难确定在许多情况下,任何
Func
(或
Func
等)都不会被视为谓词



如果LINQ在
Where
中使用
Predicate
,但在其他任何地方使用
Func
,包括
Where
的另一个重载
Where
类点1{int x,y;}
类点2{int x,y;}
相同,那就很奇怪了?当然不是,但他们有相似之处。但是需要Point1的方法永远不会接受Point2实例作为参数。Delagate与signature不兼容。AFAIK、.NET 3.5仅引入了最多包含4个参数的变体。@PetSerAl-已更正并添加脚注。
Predicate<Product> secondpredicate = ...