أليست Func<T, bool> و Predicate<T> نفس الشيء بعد التجميع؟
سؤال
لم يتم تشغيل العاكس لإلقاء نظرة على الفرق ولكن هل يتوقع المرء رؤية نفس الكود المترجم بالضبط عند المقارنة Func<T, bool>
ضد. Predicate<T>
أتصور أنه لا يوجد فرق لأن كلاهما يأخذ معلمة عامة ويعودان منطقيًا؟
المحلول
إنهم يشتركون في نفس التوقيع، لكنهم ما زالوا أنواعًا مختلفة.
نصائح أخرى
روبرت س.صحيح تماما؛على سبيل المثال:-
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>
و Func<string, bool>
).ولكن كما حاولت أن أشير، فإن "معنى" الاثنين مختلفان.
هذا يشبه إلى حد ما إذا قمت بإنشاء فصلين، class Car { string Color; decimal Price; }
و class Person { string FullName; decimal BodyMassIndex; }
, ، ثم فقط لأن كلاهما يحملان string
و أ decimal
, ، هذا لا يعني أنهم من نفس النوع.