`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 文件)