`Dictionary<TKey, TValue>.KeyCollection` 是否实现了 `IReadOnlyCollection`?
Does `Dictionary<TKey, TValue>.KeyCollection` implement `IReadOnlyCollection` or not?
问题看起来很简单。尽管 documentation 表示确实如此:
public sealed class KeyCollection : ICollection<TKey>,
IReadOnlyCollection<TKey>, IEnumerable<TKey>, ICollection, IEnumerable
以下代码报错:
class MyKeys<T>
{
readonly Dictionary<T, T> dict = new Dictionary<T, T> ();
public IReadOnlyCollection<T> Keys { get { return dict.Keys; } set; }
}
表示没有从 KeyCollection<T>
到 IReadOnlyCollection<T>
的转换。
此外 polish documentation(就此而言也是法语)说它没有:
[SerializableAttribute]
public sealed class KeyCollection : ICollection<TKey>,
IEnumerable<TKey>, ICollection, IEnumerable
这是哪个?
如果是英文文档中的错误,一个额外的问题:
有没有办法让 Keys
成为只读集合?
在撰写此答案时,reference source 不包含 IReadOnlyCollection 接口实现:
public sealed class KeyCollection: ICollection<TKey>, ICollection
从那时起,参考源已更新为现在包含 IReadOnlyCollection 接口。
public sealed class KeyCollection: ICollection<TKey>, ICollection, IReadOnlyCollection<TKey>
您指的是 .Net framework 4.5 的文档。添加到哪里。 source code 有
public sealed class KeyCollection: ICollection<TKey>, ICollection
如果你看documentation for .Net framework 4.0那么它有:
public sealed class KeyCollection : ICollection<TKey>,
IEnumerable<TKey>, ICollection, IEnumerable
其中 ICollection<TKey>
implements IEnumerable<T>
和 ICollection
实现了 IEnumerable
,因此没有实现 IReadOnlyCollection<TKey>
。
Is there a way to get Keys as read-only collection?
你可以这样做:
ReadOnlyCollection<int> readonlyKeys = new ReadOnlyCollection<int>(dictionary.Keys.ToList());
Dictionary.KeyCollection
目前没有实施 IReadOnlyCollection
.
但是,该接口已添加到下一版本的 .Net (v4.6) 中。你可以看到使用 VS 2015 预览。
您还可以在 this announcement 中看到(下载包含 v4.6 的所有更改的 excel 文件)
问题看起来很简单。尽管 documentation 表示确实如此:
public sealed class KeyCollection : ICollection<TKey>,
IReadOnlyCollection<TKey>, IEnumerable<TKey>, ICollection, IEnumerable
以下代码报错:
class MyKeys<T>
{
readonly Dictionary<T, T> dict = new Dictionary<T, T> ();
public IReadOnlyCollection<T> Keys { get { return dict.Keys; } set; }
}
表示没有从 KeyCollection<T>
到 IReadOnlyCollection<T>
的转换。
此外 polish documentation(就此而言也是法语)说它没有:
[SerializableAttribute]
public sealed class KeyCollection : ICollection<TKey>,
IEnumerable<TKey>, ICollection, IEnumerable
这是哪个?
如果是英文文档中的错误,一个额外的问题:
有没有办法让 Keys
成为只读集合?
在撰写此答案时,reference source 不包含 IReadOnlyCollection 接口实现:
public sealed class KeyCollection: ICollection<TKey>, ICollection
从那时起,参考源已更新为现在包含 IReadOnlyCollection 接口。
public sealed class KeyCollection: ICollection<TKey>, ICollection, IReadOnlyCollection<TKey>
您指的是 .Net framework 4.5 的文档。添加到哪里。 source code 有
public sealed class KeyCollection: ICollection<TKey>, ICollection
如果你看documentation for .Net framework 4.0那么它有:
public sealed class KeyCollection : ICollection<TKey>,
IEnumerable<TKey>, ICollection, IEnumerable
其中 ICollection<TKey>
implements IEnumerable<T>
和 ICollection
实现了 IEnumerable
,因此没有实现 IReadOnlyCollection<TKey>
。
Is there a way to get Keys as read-only collection?
你可以这样做:
ReadOnlyCollection<int> readonlyKeys = new ReadOnlyCollection<int>(dictionary.Keys.ToList());
Dictionary.KeyCollection
目前没有实施 IReadOnlyCollection
.
但是,该接口已添加到下一版本的 .Net (v4.6) 中。你可以看到使用 VS 2015 预览。
您还可以在 this announcement 中看到(下载包含 v4.6 的所有更改的 excel 文件)