Domanda

Ecco il problema. Vorrei creare una classe che conterrà i dati di configurazione. Questi dati consiste di coppie chiave / valore. Alcuni esempi: "hostname" = "localhost", "timeout" = 1000, ecc .. La mia idea iniziale era quella di memorizzare tutti questi in un dizionario generico:

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

E la classe ConfigurationItem come:

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

Le mie speranze sono che posso interrogare e impostare la configurazione come segue:

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

Purtroppo, non riesco a inserire gli elementi nel dizionario di configurazione utilizzando il seguente codice:

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

Le parti in grassetto mostrano errori:

  

Non è possibile convertire il tipo ConfigurationItem per ConfigurationItem

Sto usando C # 4.0 in quanto speravo di risolto questo problema utilizzando la nuova funzione di varianza, ma senza fortuna finora. Se sono necessarie ulteriori informazioni, basta il nome! Grazie per l'aiuto!

È stato utile?

Soluzione

Si può solo definire il dizionario come dizionario privato , e gettato gli oggetti prima di ritorno dal metodo Get.

Altri suggerimenti

Covarianza e controvarianza in C # 4.0 si applica solo alle interfacce e ai delegati.

È necessario anteporre il parametro di tipo con in o out, a seconda della posizione degli usi del parametro tipo nelle definizioni del membro di interfaccia.

Ad esempio:

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

Poiché IDictionary<TKey,TValue> utilizza entrambi i parametri di tipo per ingressi e uscite, dizionario non sono covariante o controvariante.

Da C # 4.0 progetti di limitazioni specifiche di varianza

23.3 Limitazioni parametri del tipo di co- e controvarianti possono essere dichiarate solo su interfacce e tipi di delegare. Co- e controvarianza applica solo quando v'è un riferimento (o identità) conversione tra gli argomenti di tipo. Ad esempio, un IEnumerable<int> non è IEnumerable<object> perché la conversione da int in oggetto è una conversione pugilato, non una conversione di riferimento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top