Casting eines allgemeinen Wörterbuchs mit einem allgemeinen Wörterbuch

8

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?)

    
nicodemus13 12.04.2011, 13:59
quelle

3 Antworten

4

IDictionary unterstützt keine Kovarianz.

Schau hier IDictionary & lt; TKey, TValue & gt; in .NET 4 nicht kovariant

    
Aliostad 12.04.2011, 14:03
quelle
11

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.

    
Eric Lippert 12.04.2011 14:22
quelle
1

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.

    
Anthony Pegram 12.04.2011 14:04
quelle