Aiuto utilizzando la varianza in C # 4.0
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!
Soluzione
Si può solo definire il dizionario come dizionario privato
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.