سؤال

ها هي المشكلة. أرغب في إنشاء فئة ستحتوي على بيانات التكوين. تتكون هذه البيانات من أزواج مفتاح / قيمة. بعض الأمثلة: "اسم المضيف" = "المحلي"، "مهلة" = 1000، إلخ. كانت فكرتي الأولية هي تخزين كل هذه في قاموس عام:

private Dictionary<string, ConfigurationItem<object>> Configuration = 
    new Dictionary<string, ConfigurationItem<object>>();

وفئة ضبط الاعدادات على النحو التالي:

public class ConfigurationItem<T>
{
    public string Name { get; set; }
    public T Value { get; set; }
}

آمالي هي أنه يمكنني الاستعلام وتعيين التكوين على النحو التالي:

int i = Configuration.Get<int>("Timeout");
Configuration.Set("Timeout", 1000);

لسوء الحظ، لا يمكنني إدراج عناصر في قاموس التكوين باستخدام التعليمات البرمجية التالية:

public void SetValue<T>(string key, ConfigurationItem<T> value)
{
        if (Configuration.ContainsKey(key.ToUpper()))
            Configuration[key.ToUpper()] = **value**;
        else
            Configuration.Add(key.ToUpper(),  **value**);
}

الأجزاء الغامقة تظهر أخطاء:

لا يمكن تحويل نوع الجهازu003CT> إلى الاعرضيةu003CObject>

أنا أستخدم C # 4.0 منذ أن أعملت في إصلاح هذه المشكلة باستخدام ميزة التباين الجديدة، ولكن لا حظ حتى الآن. إذا كانت هناك حاجة إلى مزيد من المعلومات، فقط اسمها! شكرا لمساعدتك!

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

المحلول

يمكنك فقط تحديد قاموسكu003Cstring, object> ، وإلقاء الكائنات قبل إرجاعها من طريقة الحصول عليها.

نصائح أخرى

ينطبق Covariance والمكافآت في C # 4.0 فقط على الواجهات والمندوبين.

يجب عليك بادئة معلمة النوع مع in أو out, ، اعتمادا على موقع الفوائد في المعلمة من النوع في تعريفات عضو الواجهة.

علي سبيل المثال:

public interface IConfigurationItem<out T>
{
    public string Name { get; set; }
    public T Value { get; set; }
}

لأن IDictionary<TKey,TValue> يستخدم كل من معلمات النوع الخاصة به للمدخلات والمخرجات، القاموس ليس covariant أو متناقض.

من C # 4.0 مودة مواصفات حدود المواصفات

23.3 يمكن الإعلان عن المعلمات من نوع القيود والمكافحة فقط عند واجهات وأنواع المندوبين. ينطبق التعاوني والمكافآت فقط عندما يكون هناك تحويل مرجعي (أو هوية) بين حجج النوع. على سبيل المثال، IEnumerable<int> ليس كذلك IEnumerable<object> نظرا لأن التحويل من INT إلى كائن هو تحويل الملاكمة، وليس تحويل مرجعي.

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