Странное поведение IDictionary и словаря - PullRequest
1 голос
/ 10 сентября 2011

У меня есть следующие классы

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 Ответ

3 голосов
/ 10 сентября 2011

По той же причине, по которой вы не можете это сделать:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...