在编写一些单元测试时,我来了一个(对我而言)奇怪的事情。
我有Dictionary<string, IEnumerable<string>>
。
测试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 :(得分:4)
IEnumerable<string>
只是一个接口string[]
和List<string>
实现,它不是他们的类型。
当你得到一个对象的类型时,它会给你它的确切类型,而不是它继承的基类的类型或它实现的接口的类型。例如,它可以实现多个接口。