كيف هو عام التغاير & كونترا-الفرق تنفيذها في C# 4.0?
-
05-07-2019 - |
سؤال
لم يحضر 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