Справка по использованию variance в C # 4.0
Вопрос
Вот в чем проблема.Я хотел бы создать класс, который будет содержать данные конфигурации.Эти данные состоят из пар ключ/значение.Некоторые примеры:"Имя хоста"="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 - это боксирующее преобразование, а не ссылочное преобразование.