Hilfe in C # 4.0 Varianz
Frage
Hier ist das Problem. Ich möchte eine Klasse erstellen, die Konfigurationsdaten enthalten. Diese Daten bestehen aus Schlüssel / Wert-Paaren. Einige Beispiele: „hostname“ = „localhost“, „Timeout“ = 1000, etc .. Meine ursprüngliche Idee war, alle diese in einem allgemeinen Wörterbuch zu speichern:
private Dictionary<string, ConfigurationItem<object>> Configuration =
new Dictionary<string, ConfigurationItem<object>>();
Und die Configuration Item-Klasse wie:
public class ConfigurationItem<T>
{
public string Name { get; set; }
public T Value { get; set; }
}
Meine Hoffnungen sind, dass ich die Konfiguration abfragen und setzen sich wie folgt:
int i = Configuration.Get<int>("Timeout");
Configuration.Set("Timeout", 1000);
Leider kann ich nicht Elemente in der Konfigurations Wörterbuch fügen Sie den folgenden Code verwendet:
public void SetValue<T>(string key, ConfigurationItem<T> value)
{
if (Configuration.ContainsKey(key.ToUpper()))
Configuration[key.ToUpper()] = **value**;
else
Configuration.Add(key.ToUpper(), **value**);
}
Die fett gedruckten Teile zeigen Fehler:
Kann Typen nicht konvertieren Configuration Item
zu Configuration Item
Ich bin mit C # 4.0, da ich auf Fest dieses Problem zu hoffen, die neue Varianz-Funktion, aber bisher kein Glück. Wenn mehr Informationen benötigt werden, nennen Sie es einfach! Vielen Dank für Ihre Hilfe!
Lösung
Sie könnten nur Ihr Wörterbuch als private Dictionary
Andere Tipps
Kovarianz und Kontra in C # 4.0 gilt nur für Schnittstellen und Teilnehmer.
Sie müssen den Typ-Parameter mit in
oder out
Präfix, abhängig von der Lage der Nutzungen des Typs Parameter in den Definitionen der Schnittstelle Element.
Zum Beispiel:
public interface IConfigurationItem<out T>
{
public string Name { get; set; }
public T Value { get; set; }
}
Da IDictionary<TKey,TValue>
verwendet sowohl den Typ Parameter für Ein- und Ausgänge, Wörterbuch nicht kovarianten oder kontra.
Von C # 4.0 Entwurfsspezifikation Varianz Einschränkungen
23,3 Einschränkungen
Co- und kontra Typ-Parameter können nur auf Schnittstellen und Delegattypen deklariert werden. Co- und Kontra gilt nur, wenn es eine Referenz (oder Identität) Umwandlung zwischen den Typargumente ist. Zum Beispiel ist ein IEnumerable<int>
kein IEnumerable<object>
, da die Umwandlung von int zu Objekt eine Box-Konvertierung, keine Referenzkonvertierung.