21

違いを確認するためにリフレクターを起動していませんが、Func<T, bool> vs .Predicate<T>

どちらもジェネリックパラメーターを取り、ブール値を返すので、違いはないと思いますか?

4

4 に答える 4

18

それらは同じ署名を共有していますが、それでもタイプは異なります。

于 2008-08-28T16:48:26.357 に答える
17

ロバート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");
  }
}
于 2008-08-31T14:18:28.457 に答える
2

より柔軟なFuncファミリは .NET 3.5 で初めて登場したため、必要に応じて以前に含める必要があった型を機能的に複製します。

(さらに、名前Predicateは、ソース コードの読者に意図された使用法を伝えます)

于 2009-11-14T20:02:26.770 に答える
0

ジェネリックがなくても、シグネチャと戻り値の型が同じであるさまざまなデリゲート型を持つことができます。例えば:

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);
}

上記の例では、2 つの非ジェネリック型が同じシグネチャと戻り値の型を持っています。Predicate<string>(実際にはや と同じFunc<string, bool>です)。しかし、私が指摘しようとしたように、この 2 つの「意味」は異なります。

class Car { string Color; decimal Price; }これは、2 つのクラスandを作成した場合と似ていclass Person { string FullName; decimal BodyMassIndex; }ますが、両方が astringと adecimalを保持しているからといって、それらが「同じ」型であるとは限りません。

于 2013-02-23T21:40:31.120 に答える