По той же причине, по которой вы не можете это сделать:
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.