Здесь три вещи не так:
IDictionary<TKey, TValue>
инвариантен в обоих параметрах своего типа
- Общая дисперсия не работает для типов значений (
int
здесь)
- Если бы это было ковариантным, вы бы попытались использовать его неправильно: вы на самом деле пытаетесь использовать противоположность
Вы должны игнорировать часть dynamic
здесь - это красная сельдь. Попробуйте выработать какой-нибудь код, который, как вы ожидаете, будет работать, который не использует dynamic
. Вот пример того, почему IDictionary<,>
является инвариантом:
// Suppose it were covariant in value...
Dictionary<string, string> stringToString = new Dictionary<string, string>();
IDictionary<string, object> stringToObject = stringToString;
stringToObject["foo"] = new MemoryStream();
string value = stringToString["foo"]; // Um?
// Suppose it were contravariant in value...
Dictionary<string, object> stringToObject = new Dictionary<string, object>();
IDictionary<string, string> stringToString = stringToString;
stringToObject["foo"] = new MemoryStream();
string value = stringToString["foo"]; // Um?