Func<T, bool> と Predicate<T> はコンパイル後は同じものではないでしょうか?

StackOverflow https://stackoverflow.com/questions/32709

  •  09-06-2019
  •  | 
  •  

質問

違いを確認するためにリフレクターを起動していませんが、比較するとまったく同じコンパイル済みコードが表示されると予想されます。 Func<T, bool>Predicate<T>

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

役に立ちましたか?

解決

これらは同じシグネチャを共有していますが、依然として異なるタイプです。

他のヒント

ロバート 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);
}

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

これは、2 つのクラスを作成した場合に似ています。 class Car { string Color; decimal Price; } そして class Person { string FullName; decimal BodyMassIndex; }, 、そして、両方が を保持しているという理由だけで、 string そして decimal, 、それは彼らが「同じ」タイプであるという意味ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top