2017-11-11 55 views
0

在寫一些單元測試的時候,我來了一個(對我來說)是奇怪的東西。我有一個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<>以避免這種情況。

+0

如果你有一個'IEnumerable ',並且你把'Cat'和'Dog'類型放到它裏面,你不希望它們在它們出來時改變物種,或者忘記它們是什麼物種。 –

回答

4

IEnumerable<string>只是一個接口string[]List<string>的實現,它不是它們的類型。

當你得到一個對象的類型時,它會給你它的確切類型,而不是它所繼承的基類的類型或它實現的接口的類型。它可以例如實現多個接口。

+0

現在踢我的頭......顯然這是一個接口,而不是一個類型。猜猜我必須減少工作時間並獲得額外的睡眠。無論如何,Thx! – Koen

相關問題