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