IDictionary<TKey, TValue>
в .NET 4/Silverlight 4 не поддерживает ковариацию, т.е. я не могу сделать
IDictionary<string, object> myDict = new Dictionary<string, string>();
аналог того, что я могу сделать с IEnumerable<T>
сейчас.
Вероятно, сводится к тому, что KeyValuePair<TKey, TValue>
не является ковариантным. Я считаю, что ковариация должна допускаться в словарях, по крайней мере, для значений.
Так что это ошибка или функция? Придет ли это когда-нибудь, возможно, в .NET 37.4?
ОБНОВЛЕНИЕ (2 года спустя):
В .NET 4.5 будет IReadOnlyDictionary<TKey, TValue>
, но он не будет ковариантным либо :·/
, потому что он происходит из IEnumerable<KeyValuePair<TKey, TValue>>
, а KeyValuePair<TKey, TValue>
не является интерфейсом и, следовательно, не может быть ковариантным.
Команда BCL должна будет перепроектировать много, чтобы подойти и использовать вместо нее ICovariantPair<TKey, TValue>
. Кроме того, ковариантные интерфейсы не могут быть введены строго типизированными индексаторами á la this[TKey key]
. Подобный конец может быть достигнут только путем размещения метода расширения GetValue<>(this IReadOnlyDictionary<TKey, TValue> self, TKey key)
где-то, что бы как-то внутренне требовало фактической реализации, которая, по-видимому, выглядит довольно беспорядочным.