在寫一些單元測試的時候,我來了一個(對我來說)是奇怪的東西。我有一個Dictionary<string, IEnumerable<string>>
。字典<TKey,TValue>:TValue的確切類型取決於你放入的內容
測試Assert.IsType<Dictionary<string, IEnumerable<string>>>(result)
通過。
但是Assert.IsType<IEnumerable<string>>(result["myKey"])
失敗。 應該是System.String[]
。
我寫了一個用於驗證的快速控制檯應用程序,甚至讓我更驚訝。 如果我添加了string[]
或List<string>
,值的類型是不同的。
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());
了:
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]
我知道,無論string[]
和List<string>
是IEnumerable<string>
,但結果是我沒想到的。 任何人都可以對此行爲有所洞察嗎?
在旁註:我將我的測試從Assert.IsType<>
改爲Assert.IsAssignableFrom<>
以避免這種情況。
如果你有一個'IEnumerable',並且你把'Cat'和'Dog'類型放到它裏面,你不希望它們在它們出來時改變物種,或者忘記它們是什麼物種。 –