Ayuda para utilizar la varianza en C # 4.0
Pregunta
Aquí está el problema. Me gustaría crear una clase que contendrá los datos de configuración. Estos datos constan de pares clave / valor. Algunos ejemplos: "hostname" = "localhost", "tiempo de espera" = 1000, etc .. Mi idea inicial era para almacenar todos estos en un diccionario genérico:
private Dictionary<string, ConfigurationItem<object>> Configuration =
new Dictionary<string, ConfigurationItem<object>>();
Y la clase ConfigurationItem como:
public class ConfigurationItem<T>
{
public string Name { get; set; }
public T Value { get; set; }
}
Mis esperanzas son que puedo consultar y establecer la configuración de la siguiente manera:
int i = Configuration.Get<int>("Timeout");
Configuration.Set("Timeout", 1000);
Por desgracia, no puedo insertar elementos en el diccionario de configuración utilizando el siguiente 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**);
}
Las partes en negrita están mostrando errores:
No se puede convertir tipo ConfigurationItem
para ConfigurationItem
Estoy usando C # 4.0, ya que esperaba que fija este problema utilizando la nueva función de la varianza, pero sin suerte hasta ahora. Si se necesita más información, sólo tienen que pedir! Gracias por su ayuda!
Solución
Se podía definir su diccionario como diccionario privada
Otros consejos
Covarianza y contravarianza en C # 4.0 sólo se aplica a las interfaces y delegados.
Debe prefijar el parámetro de tipo con in
o out
, dependiendo de la localización de los usos del parámetro de tipo en las definiciones de los miembros interfaz.
Por ejemplo:
public interface IConfigurationItem<out T>
{
public string Name { get; set; }
public T Value { get; set; }
}
Debido IDictionary<TKey,TValue>
utiliza tanto sus parámetros de tipo de entradas y salidas, diccionario no son covariantes o contravariantes.
A partir de C # 4.0 limitaciones de calado especificación de varianza
23.3 Limitaciones
los parámetros de tipo co- y contravariant sólo pueden ser declaradas en las interfaces y tipos de delegado. Co- y contravarianza sólo se aplica cuando hay una conversión de referencia (o identidad) entre los argumentos de tipo. Por ejemplo, un IEnumerable<int>
no es una IEnumerable<object>
porque la conversión de int a objeto es una conversión de boxeo, no una conversión de referencia.