还没有启动反射器来查看差异,但是在比较Func<T, bool>
与其他代码时会期望看到完全相同的编译代码。Predicate<T>
我想两者都采用泛型参数并返回布尔值没有区别?
它们共享相同的签名,但它们仍然是不同的类型。
Robert S. 是完全正确的;例如:-
class A {
static void Main() {
Func<int, bool> func = i => i > 100;
Predicate<int> pred = i => i > 100;
Test<int>(pred, 150);
Test<int>(func, 150); // Error
}
static void Test<T>(Predicate<T> pred, T val) {
Console.WriteLine(pred(val) ? "true" : "false");
}
}
更灵活的Func
系列仅出现在 .NET 3.5 中,因此它会在功能上复制之前必须包含的类型。
(加上名称Predicate
将预期用途传达给源代码的读者)
即使没有泛型,您也可以拥有签名和返回类型相同的不同委托类型。例如:
namespace N
{
// Represents a method that takes in a string and checks to see
// if this string has some predicate (i.e. meets some criteria)
// or not.
internal delegate bool StringPredicate(string stringToTest);
// Represents a method that takes in a string representing a
// yes/no or true/false value and returns the boolean value which
// corresponds to this string
internal delegate bool BooleanParser(string stringToConvert);
}
在上面的示例中,两个非泛型类型具有相同的签名和返回类型。(实际上也与Predicate<string>
and相同Func<string, bool>
)。但正如我试图指出的那样,两者的“意义”是不同的。
这有点像如果我创建两个类,class Car { string Color; decimal Price; }
and class Person { string FullName; decimal BodyMassIndex; }
,那么仅仅因为它们都持有 astring
和 a decimal
,这并不意味着它们是“相同的”类型。