違いを確認するためにリフレクターを起動していませんが、Func<T, bool>
vs .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 つの「意味」は異なります。
class Car { string Color; decimal Price; }
これは、2 つのクラスandを作成した場合と似ていclass Person { string FullName; decimal BodyMassIndex; }
ますが、両方が astring
と adecimal
を保持しているからといって、それらが「同じ」型であるとは限りません。