سؤال

لم يحضر PDC 2008 ، ولكن سمعت بعض الأخبار أن C# 4.0 أعلن لدعم عامة التغاير و كونترا الفرق.وهذا هو ، List<string> يمكن أن تسند إلى List<object>.كيف يمكن أن يكون ؟

في جون السكيت كتاب C# في العمق, هو يفسر C# الأدوية لا يدعم التغاير و كونترا الفرق.هو أساسا كتابة رمز الأمان.الآن, C# 4.0 تغيير لتقديم الدعم لهم.سوف تجلب الفوضى ؟

أي شخص يعرف تفاصيل عن C# 4.0 يمكن أن تعطي بعض التفسير ؟

هل كانت مفيدة؟

المحلول

الفرق فقط سوف تكون معتمدة في آمنة الطريقة - في الواقع ، وذلك باستخدام القدرات التي CLR بالفعل.لذلك أمثلة أعطي في الكتاب من محاولة استخدام List<Banana> كما List<Fruit> (أو أيا كان) لا تزال لا تعمل - ولكن عدد قليل من السيناريوهات الأخرى سوف.

أولا سوف يتم دعم واجهات و المندوبين.

ثانيا ، يتطلب من صاحب واجهة/مندوب لتزيين نوع المعلمات كما in (على contravariance) أو out (على التغاير).المثال الأكثر وضوحا هو IEnumerable<T> الذي من أي وقت مضى فقط يتيح لك اتخاذ القيم "الخروج" من أنه لا تمكنك من إضافة جديدة.التي سوف تصبح IEnumerable<out T>.هذا لا يضر نوع السلامة في كل شيء ، ولكن يتيح لك إعادة IEnumerable<string> من طريقة أعلن العودة IEnumerable<object> على سبيل المثال.

Contravariance الصعب إعطاء أمثلة ملموسة على استخدام واجهات, ولكن من السهل مع مندوب.النظر في Action<T> - أن يمثل فقط الأسلوب الذي يأخذ T معلمة.سيكون من الجميل أن تكون قادرة على تحويل بسهولة استخدام Action<object> كما Action<string> - أي الأسلوب الذي يأخذ object المعلمة سوف يكون على ما يرام عندما قدمت مع string بدلا من ذلك.بالطبع, C# 2 بالفعل التغاير و contravariance من المندوبين إلى حد ما ، ولكن عن طريق التحويل الفعلية من مندوب واحد من نوع إلى آخر (إنشاء مثيل جديد) - انظر P141-144 للحصول على أمثلة.C# 4 سيجعل هذا أكثر عمومية ، و (أعتقد) تجنب إنشاء مثيل جديد من أجل التحويل.(سيكون مرجع التحويل بدلا من ذلك.)

نأمل أن يكون هذا يزيل عنه قليلا - واسمحوا لي أن أعرف إذا كان لا معنى له!

نصائح أخرى

غير أن جون لم يكن قد غطت عليه ، ولكن هنا بعض روابط المدونات ومقاطع الفيديو من إريك ليبرت.انه يقوم بعمل لطيفة شرح مع الأمثلة.

https://blogs.msdn.microsoft.com/ericlippert/2007/10/16/covariance-and-contravariance-in-c-part-one/

الفيديو:

https://www.youtube.com/watch?v=3MQDrKbzvqU

https://www.youtube.com/watch?v=XRIadQaBYlI

https://www.youtube.com/watch?v=St9d2EDZfrg

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