字典在 .NET 4 中不是協變的
.NET 4 / Silverlight 4 中的
IDictionary<TKey, TValue>不支持共變異數,即我不能做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)某個地方放置一個擴展方法來實現,該方法在內部必須以某種方式呼叫一個實際的實現,可以說這看起來是一種非常混亂的方法。
這是一個特點。.NET 4.0 僅支持安全共變異數。您提到的演員表具有潛在危險,因為如果可能的話,您可以將非字元串元素添加到字典中:
IDictionary<string, object> myDict = new Dictionary<string, string>(); myDict["hello"] = 5; // not an string另一方面,
IEnumerable<T>是一個只讀介面。Ttype 參數僅在其輸出位置(屬性的返回類型)Current,因此可以安全地IEnumerable<string>視為IEnumerable<object>.