Dot-Net

字典在 .NET 4 中不是協變的

  • January 27, 2010

.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>.

引用自:https://stackoverflow.com/questions/2149589