لماذا نحتاج إلى كلمات رئيسية جديدة للتباين والتباين في C#؟

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

سؤال

هل يمكن لأي شخص أن يشرح سبب الحاجة إلى إضافة معلمة خارجية أو داخلية للإشارة إلى أن النوع العام هو متغير Co أو Contra في C# 4.0؟

لقد كنت أحاول أن أفهم سبب أهمية ذلك ولماذا لا يتمكن المترجم من اكتشافه.

شكرًا،

جوش

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

المحلول

واريك ليبرت، الذي يعمل على الناطقة، لديها سلسلة من الوظائف على MSDN من شأنها أن تساعد توضيح المسائل المعنية:
http://blogs.msdn.com/ericlippert/ أرشيف / علامات / التغاير + + وContravariance / default.aspx

عند قراءة مقالات تظهر في ذلك الارتباط، تبدأ في أسفل والعمل لمدة تصل.

وأخيرا ستحصل على <لأ href = "http://blogs.msdn.com/ericlippert/archive/2007/10/29/covariance-and-contravariance-in-c-part-seven-why- إعمل نحن-ضرورة واحد في بناء جملة المعرضين للall.aspx "يختلط =" نوفولو noreferrer "> # 7 (لماذا نحتاج إلى بناء الجملة في كل شيء؟) .

نصائح أخرى

ونحن في الواقع لا <م> الحاجة منهم، أي أكثر ثم نحن بحاجة abstract على الطبقات أو كليهما out وref. وجدت فقط حتى يتسنى لنا، والمبرمجين، يمكن أن تجعل لدينا وضوح الشمس نية واضحة، بحيث مبرمج صيانة يعرفون ما نقوم به، ومترجم يمكن التحقق من أننا نفعل ذلك بطريقة صحيحة.

وكذلك، فإن المشكلة الرئيسية هي أنه إذا كان لديك التسلسل الهرمي الطبقة مثل:

   class Foo { .. } 

   class Bar : Foo { .. } 

ولديك IEnumerator<Bar>، لا يمكنك استخدام ذلك بمثابة IEnumerator<Foo> على الرغم من أنه لن يكون آمنا تماما. في 3.5 هذا يفرض على عدد كبير من تقلبات مؤلمة. أن هذه العملية تكون دائما آمنة ولكن تم رفض من قبل النظام نوع لأنه لا يعرف عن استخدام التغاير نوع المعلمة العامة. IEnumerator<Bar> يمكن العودة فقط Bar وكل Bar هو Foo.

وبالمثل، إذا كان لديك IEqualityComparer<Foo> أنها يمكن أن تستخدم للمقارنة بين أي زوج من الكائنات من النوع Foo حتى لو واحد أو كلا هو Bar، ولكن لا يمكن أن يلقي إلى IEqualityComparer<Bar> لأنه لا يعرف عن استخدام contravariant من نوع المعلمة العامة. IEqualityComparer<Foo> يستهلك فقط كائنات من نوع Foo وكل Bar هو Foo.

وبدون هذه الكلمات نحن مجبرون على تحمل حجة العامة يمكن أن يحدث على حد سواء حجة لطريقة وكنوع نتيجة لطريقة، ولذا فإننا لا يمكن أن نسمح بأمان إما من التحويلات المذكورة أعلاه.

ومعهم، ونوع نظام حر للسماح لنا بأمان المهوى الصاعد ومسبل بين هذه الواجهات في الاتجاه الذي تدل عليه الكلمة، ونحن على أخطاء تشير إلى عندما كنا تنتهك الانضباط اللازم لضمان السلامة.

وكانت

وin وout كلمات كلمات منذ C # 1.0، واستخدمت في سياق المعلمات in- وout- إلى الأساليب.

ولاتباين وتباين مرافق وتباين معاكس قيود على كيف يمكن للمرء تطبيق واجهة. لا توجد وسيلة جيدة للاستدلال عليهم - السبيل الوحيد، كما أعتقد، هي من الاستخدام، والتي من شأنها أن تكون فوضوي، وفي النهاية فإنه لا تعمل

قدم كل من جون وجويل إجابة كاملة جدًا لهذا السؤال، ولكن خلاصة القول هي أنهما ليسا كثيرًا ضروري بواسطة المترجم ولكنه يساعد في ضمان سلامة التنفيذ من خلال الإشارة بوضوح إلى تباين المعلمة.يتبع هذا نمطًا مشابهًا جدًا لطلب out أو ref الكلمة الأساسية في كل من موقع الاتصال وموقع الإعلان.

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