أليست Func<T, bool> و Predicate<T> نفس الشيء بعد التجميع؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

لم يتم تشغيل العاكس لإلقاء نظرة على الفرق ولكن هل يتوقع المرء رؤية نفس الكود المترجم بالضبط عند المقارنة 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, ، هذا لا يعني أنهم من نفس النوع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top