2017-11-11 12 views
0

schreiben Während ich einige Unittests schreibe, kam ich accros eine (für mich das ist) seltsame Sache.Wörterbuch <TKey,TValue>: genaue Art von TValue hängt davon ab, was Sie in

Ich habe eine Dictionary<string, IEnumerable<string>>.

Der Test Assert.IsType<Dictionary<string, IEnumerable<string>>>(result) besteht.

Jedoch Assert.IsType<IEnumerable<string>>(result["myKey"]) schlägt fehl. Es sollte stattdessen System.String[] sein.

Ich schrieb eine schnelle Konsole App zur Verifizierung und das überraschte mich sogar mehr. Der Typ des Werts war unterschiedlich, wenn ich einen string[] oder List<string> hinzufügte.

var dic = new Dictionary<string, IEnumerable<string>>(); 
dic.Add("myArrayKey", new[] { "Value1", "Value2" }); 
dic.Add("myListKey", new List<string> { "Value1", "Value2" }); 

Console.Write("Type of dic should be Dictionary<string, IEnumerable<string>> : "); 
Console.WriteLine(dic.GetType()); 
Console.Write("Type of dic[myListKey] should be IEnumerable<string> : "); 
Console.WriteLine(dic["myArrayKey"].GetType()); 
Console.Write("Type of dic[myArrayKey] should be IEnumerable<string> : "); 
Console.WriteLine(dic["myListKey"].GetType()); 

in Resultierte:

Type of dic should be Dictionary<string, IEnumerable<string>> : System.Collections.Generic.Dictionary`2[System.String,System.Collections.Generic.IEnumerable`1[System.String]] 
Type of dic[myArrayKey] should be IEnumerable<string> : System.String[] 
Type of dic[myListKey] should be IEnumerable<string> : System.Collections.Generic.List`1[System.String] 

Ich weiß, dass beide string[] und List<string>IEnumerable<string> sind, aber das Ergebnis ist etwas, was ich überhaupt nicht erwartet hatte. Kann jemand etwas Einblick in dieses Verhalten geben?

Auf einer Nebenbemerkung: Ich habe meinen Test von Assert.IsType<> zu Assert.IsAssignableFrom<> geändert, um dies zu vermeiden.

+0

Wenn Sie ein 'IEnumerable ' haben und Sie 'Katze' und' Hund' Typen hineinlegen, würden Sie nicht wollen, dass sie Arten ändern, wenn sie herauskamen, oder um zu vergessen, welche Spezies sie waren. –

Antwort

4

IEnumerable<string> ist nur eine Schnittstelle string[] und List<string> implementieren, es ist nicht ihr Typ.

Wenn Sie den Typ eines Objekts erhalten, gibt es Ihnen seinen genauen Typ, nicht den Typ der Basisklasse, von der es erbt, oder den Typ einer Schnittstelle, die es implementiert. Es kann zum Beispiel mehrere Schnittstellen implementieren.

+0

Ich trete jetzt sofort in den Kopf ... Offensichtlich ist es eine Schnittstelle und kein Typ. Ich denke, ich muss die Arbeitszeit reduzieren und etwas mehr Schlaf bekommen. Thx sowieso! – Koen

Verwandte Themen