Ajuda usando variância em C # 4.0
Pergunta
Aqui está o problema. Eu gostaria de criar uma classe que irá conter dados de configuração. Estes dados consistem de pares de chave / valor. Alguns exemplos: "hostname" = "localhost", "tempo de espera" = 1000, etc .. Minha idéia inicial era para armazenar tudo isso em um dicionário genérico:
private Dictionary<string, ConfigurationItem<object>> Configuration =
new Dictionary<string, ConfigurationItem<object>>();
E a classe item de configuração como:
public class ConfigurationItem<T>
{
public string Name { get; set; }
public T Value { get; set; }
}
As minhas esperanças são que eu possa consultar e definir a configuração da seguinte forma:
int i = Configuration.Get<int>("Timeout");
Configuration.Set("Timeout", 1000);
Infelizmente, eu não posso inserir itens no dicionário de configuração utilizando o seguinte código:
public void SetValue<T>(string key, ConfigurationItem<T> value)
{
if (Configuration.ContainsKey(key.ToUpper()))
Configuration[key.ToUpper()] = **value**;
else
Configuration.Add(key.ToUpper(), **value**);
}
As peças ousadas estão mostrando erros:
Não é possível converter tipo de item de configuração
para item de configuração
Eu estou usando C # 4.0 desde que eu esperava fixo este problema usando o novo recurso de variância, mas sem sorte até agora. Se forem necessárias mais informações, basta nomeá-la! Obrigado pela sua ajuda!
Solução
Você poderia apenas definir o seu dicionário como dicionário privada
Outras dicas
Covariância e contravariance em C # 4.0 só se aplica a interfaces e delegados.
Você deve prefixar o parâmetro de tipo com in
ou out
, dependendo da localização de usos do parâmetro de tipo nas definições do membro interface.
Por exemplo:
public interface IConfigurationItem<out T>
{
public string Name { get; set; }
public T Value { get; set; }
}
Porque usos IDictionary<TKey,TValue>
ambos os seus parâmetros de tipo para entradas e saídas, dicionário não são covariant ou contravariant.
De C # 4.0 projectos de limitações de variância especificação
23.3 Limitações
parâmetros de tipo de co- e contravariantes só pode ser declarada em interfaces e tipos de delegado. Co- e contravariância aplica-se apenas quando há uma conversão de referência (ou identidade) entre os argumentos de tipo. Por exemplo, um IEnumerable<int>
não é um IEnumerable<object>
porque a conversão de int para objeto é uma conversão de boxe, não uma conversão de referência.