Ich habe:
%Vor%und ich möchte es in eine Schnittstellenversion umwandeln, d. h .:
%Vor%'someInterfaceInstance' ist eine öffentliche Eigenschaft:
%Vor%Dies wird korrekt kompiliert, löst jedoch einen Laufzeitfehler aus.
%Vor%Was vermisse ich? (Probleme mit dem verschachtelten generischen Typ / Eigenschaft?)
IDictionary
unterstützt keine Kovarianz.
Schau hier IDictionary & lt; TKey, TValue & gt; in .NET 4 nicht kovariant
Die anderen Antworten stimmen, aber um klar zu sein, warum dies illegal ist, bedenken Sie Folgendes:
%Vor%Keine sterbliche Hand kann dich daran hindern, einen Tiger in ein Wörterbuch von Tieren zu setzen. Aber dieses Wörterbuch ist eigentlich darauf beschränkt, nur Giraffen zu enthalten.
Aus dem gleichen Grund können Sie auch nicht anders herum gehen:
%Vor%Jetzt stellst du einen Tiger in eine Variable vom Typ Giraffe.
Generische Kovarianz der Schnittstelle ist nur in C # 4 zulässig, wenn der Compiler beweisen kann, dass solche Situationen nicht auftreten können.
Das meiste, was Sie tun können, ist
%Vor% Der Grund, warum Ihr inneres Wörterbuch hier nicht anders referenziert werden kann (oder über einen Cast) ist, dass Dictionary<string, bool>
ein IDictionary<string, bool>
ist, nicht alle IDictionary
Objekte sind Dictionary
Objekte. Wenn Sie also einen reinen Interface-Cast erhalten, können Sie scheinbar andere <string, IDictionary<string, bool>>
-Paare zur ursprünglichen Collection hinzufügen, wenn es eindeutig zu einer Verletzung des ursprünglichen Objekts kommen könnte. Daher wird dies nicht unterstützt.
Tags und Links c# nested generics dictionary casting