IDictionary和Dictionary的奇怪行为

时间:2011-09-10 16:32:50

标签: generics c#-4.0

我有以下课程

public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    public class Shop
    {
        public string Name { get; set; } 
    }

    public class Xyz
    {
        public string Abc { get; set; }
    }

为什么不允许以下

IDictionary<Person, IDictionary<Shop, Xyz>> blahItem
           = new Dictionary<Person, Dictionary<Shop, Xyz>>();

1 个答案:

答案 0 :(得分:3)

出于同样的原因你不能这样做:

IDictionary<string, Control> dict = new Dictionary<string, Button>();

假设允许......我们可以:

Dictionary buttonDict = new Dictionary<string, Button>();
IDictionary<string, Control> controlDict = buttonDict;

controlDict["bang"] = new TextArea();
Button error = buttonDict["bang"];

基本上你违反了类型安全 - IDictionary在其键或值类型中不是协变

搜索“通用差异”和“协方差”以查找更多详细信息,包括有限的支持(例如,对于IEnumerable<T> 可以以协变的方式安全使用)C#4