字典<tkey,tvalue>:TValue的确切类型取决于你输入的内容

时间:2017-11-11 14:21:20

标签: c# .net dictionary

在编写一些单元测试时,我来了一个(对我而言)奇怪的事情。

我有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<>以避免这种情况。

1 个答案:

答案 0 :(得分:4)

IEnumerable<string>只是一个接口string[]List<string>实现,它不是他们的类型。

当你得到一个对象的类型时,它会给你它的确切类型,而不是它继承的基类的类型或它实现的接口的类型。例如,它可以实现多个接口。