في عالم برمجة الحوسبة، تظهر أحيانًا تحديات غير متوقعة عند استخدام تمديدات (Extensions) مع الواجهات الجنريكية. في مثالك، لديك واجهة ITest
وثلاث فئات تمثلها، وقد واجهتك مشكلة مع تمديد (Extension) يتوقع استقبال IEnumerable
حيث T
يتوافق مع ITest
.
الخطأ الذي تواجهه، الذي يظهر بشكل واضح في الرسالة CS1929
من المترجم، يشير إلى أن IEnumerable
لا يحتوي على تعريف للطريقة ToInfoObjects
. الطريقة المطلوبة توجد في فئة التمديد Extensions
وتتوقع متغيرًا من نوع IEnumerable
بدلاً من IEnumerable
.
-
تعامل معالجة السلاسل في جافا27/03/2024
-
تحديات تكامل Leaflet مع Polymer01/02/2024
-
تنظيف مكدس C++ بكفاءة12/04/2024
-
جمع أرقام القائمة في Python25/03/2024
السبب وراء هذا السلوك يعود إلى قواعد التحليل التي يقوم بها المترجم. في اللغة C#، ليس من الممكن استخدام تحول النوع (Covariance) مع الواجهات الجنريكية في سياق تعريف تمديد. يعني ذلك أنه حتى وإن كان نوع T
يتوافق مع ITest
، فإن IEnumerable
و IEnumerable
تعتبران نوعين مختلفين.
لحل هذه المشكلة، يمكنك استخدام الواجهة IEnumerable
، وهي تدعم Covariance. يمكنك تحديث تعريف الطريقة ToInfoObjects
كما يلي:
csharppublic static IEnumerable ToInfoObjects(
this IEnumerable collection )
{
return collection.Select(item => new ElementInfo());
}
باستخدام IEnumerable
، يصبح بإمكانك توقع IEnumerable
كمدخل للتمديد، وذلك بفضل توافق Covariant. تمثل هذه الطريقة تحسينًا في التوافق بين التمديدات الجنريكية والواجهات المختلفة.
المزيد من المعلومات
عند التعامل مع Covariance في C#، يمكن أن يكون من المفيد فهم بعض النقاط الإضافية التي قد تسهم في توضيح الوضع.
أولًا وقبل كل شيء، يُشير الـ Covariance إلى إمكانية استخدام نوع مشتق (T
) في مكان حيث يتوقع نوع الأصل (ITest
). في مثالك، تتبنى الواجهة IEnumerable
هذا المفهوم.
عندما تقوم بتعريف الطريقة ToInfoObjects
باستخدام IEnumerable
، يصبح بإمكانك استخدامها مع IEnumerable
بكل سهولة، وهذا بسبب توافق Covariance. يعني هذا أنه يُسمح بتحويل نوع المتغير IEnumerable
إلى IEnumerable
، وهذا ما يجعل استدعاء الطريقة ToInfoObjects
داخل الطريقة الأخرى Method
ممكنًا.
التوضيح الثاني يتعلق بفهم الفرق بين Covariance و Contravariance. في هذا السياق، Covariance تسمح بتحويل نوع المتغير من نوع أكبر إلى نوع أصغر، بينما Contravariance تسمح بالعكس. وهذا يعني أنه إذا كان لديك طريقة توقع IEnumerable
، يمكنك استخدامها مع IEnumerable
إذا كنت قد قمت بتحديد Contravariance.
فهم Covariance و Contravariance يساعد على تفسير كيف يمكن استخدام التوافق الجنريك في البرمجة بشكل فعّال، مما يساهم في تطبيقات البرمجة الشاملة والمرنة.