Вопрос

Вот в чем проблема.Я хотел бы создать класс, который будет содержать данные конфигурации.Эти данные состоят из пар ключ/значение.Некоторые примеры:"Имя хоста"="localhost", "тайм-аут"= 1000 и т.д..Моя первоначальная идея состояла в том, чтобы сохранить все это в общем словаре:

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

И класс ConfigurationItem как:

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**);
}

Выделенные жирным шрифтом части показывают ошибки:

Не удается преобразовать тип ConfigurationItem<T> в ConfigurationItem<Object>

Я использую C # 4.0, так как надеялся устранить эту проблему с помощью новой функции дисперсии, но пока безуспешно.Если вам нужна дополнительная информация, просто назовите ее!Спасибо за вашу помощь!

Это было полезно?

Решение

Вы могли бы просто определить свой словарь как private Dictionary<string, object=""> и привести объекты, прежде чем возвращать их из вашего метода Get.

Другие советы

Ковариация и контравариантность в C # 4.0 применимы только к интерфейсам и делегатам.

Вы должны добавить к параметру type префикс in или out, в зависимости от расположения использований параметра type в определениях элемента интерфейса.

Например:

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

Потому что IDictionary<TKey,TValue> использует оба параметра своего типа для входных и выходных данных, словарь не является ковариантным или контравариантным.

Из проекта спецификации C # 4.0 ограничения на отклонения

23.3 Ограничения Параметры ко- и контравариантного типа могут быть объявлены только в интерфейсах и типах делегатов.Со- и контравариантность применяется только тогда, когда существует преобразование ссылки (или идентификатора) между аргументами типа.Например, an IEnumerable<int> не является IEnumerable<object> потому что преобразование из int в object - это боксирующее преобразование, а не ссылочное преобразование.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top