Question

Voici le problème. Je voudrais créer une classe qui contiendra des données de configuration. Ces données se compose de paires clé / valeur. Quelques exemples: « hostname » = « localhost », « délai d'attente » = 1000, etc .. Mon idée initiale était de stocker tout cela dans un dictionnaire générique:

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

Et la classe ConfigurationItem comme:

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

Mes espoirs sont que je peux interroger et définir la configuration comme suit:

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

Malheureusement, je ne peux pas insérer des éléments dans le dictionnaire de configuration en utilisant le code suivant:

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

Les parties en gras montrent des erreurs:

  

Impossible de convertir le type ConfigurationItem pour ConfigurationItem

J'utilise C # 4.0 depuis que j'espérais résolu ce problème en utilisant la nouvelle fonction de la variance, mais pas de chance jusqu'à présent. Si plus d'information est nécessaire, nommez-le! Merci pour votre aide!

Était-ce utile?

La solution

Vous pouvez simplement définir votre Dictionnaire comme privé Dictionnaire , et jeter les objets avant de les retourner de votre méthode Get.

Autres conseils

Covariance et contravariance à C # 4.0 applique uniquement aux interfaces et aux délégués.

Vous devez préfixer le paramètre de type avec in ou out, en fonction de l'emplacement des usages du paramètre de type dans les définitions de l'élément d'interface.

Par exemple:

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

Parce que IDictionary<TKey,TValue> utilise à la fois ses paramètres de type pour les entrées et les sorties, le dictionnaire ne sont pas covariant ou contravariant.

De C # 4.0 projet de limitation de la variance de la spécification

23,3 Limitations paramètres de type co et contravariants ne peuvent être déclarés sur les interfaces et les types de délégués. Co et contravariance applique uniquement en cas de conversion de référence (ou d'identité) entre les arguments de type. Par exemple, un IEnumerable<int> n'est pas un IEnumerable<object> parce que la conversion d'int en objet est une conversion de boxe, pas une conversion de référence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top