编译后,Func <T,bool>和Predicate <T>是不是一回事?

时间:2020-03-05 18:44:30  来源:igfitidea点击:

还没有启动反射器来观察差异,但是当比较Func &lt;T,bool>Predicate &lt;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中出现,因此它将在功能上复制必须早些时候包括在内的类型。

(加上名称"谓词"可将预期的用法传达给源代码的读者)