IDictionary<TKey, TValue> in .NET 4 not covariant
It's a feature. .NET 4.0 only supports safe covariance. The cast you mentioned is potentially dangerous as you could add a non-string element to the dictionary if that was possible:
IDictionary<string, object> myDict = new Dictionary<string, string>();
myDict["hello"] = 5; // not an string
On the other hand, IEnumerable<T>
is a read-only interface. The T
type parameter is only in its output positions (return type of the Current
property) so it's safe to treat IEnumerable<string>
as an IEnumerable<object>
.
But then you could say
myDict.Add("Hello, world!", new DateTime(2010, 1, 27));
which would fail miserably. The issue is that the TValue
in IDictionary<TKey, TValue>
is used in both input and output positions. To wit:
myDict.Add(key, value);
and
TValue value = myDict[key];
So is that a bug or a feature?
It's by design.
Will it ever come, maybe in .NET 37.4?
No, it's inherently unsafe.