`Dictionary <tkey,tvalue =“”> .KeyCollection`是否实现`IReadOnlyCollection`?</tkey,>

时间:2015-01-29 15:42:16

标签: c# .net dictionary

问题似乎很简单。虽然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成为只读集合?

3 个答案:

答案 0 :(得分:5)

在撰写此答案时,reference source不包含IReadOnlyCollection interfact实现:

public sealed class KeyCollection: ICollection<TKey>, ICollection

从那时起,参考源已更新为现在包含IReadOnlyCollection接口。

public sealed class KeyCollection: ICollection<TKey>, ICollection, IReadOnlyCollection<TKey>

答案 1 :(得分:5)

Dictionary.KeyCollection目前尚未实施IReadOnlyCollection

然而,界面已添加到下一版本的.Net(v4.6)。你可以看到使用VS 2015预览。

您还可以在this announcement中看到(下载包含v4.6所有更改的Excel文件)

答案 2 :(得分:1)

您指的是.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>

  

有没有办法让Keys成为只读集合?

你可以这样做:

ReadOnlyCollection<int> readonlyKeys = new ReadOnlyCollection<int>(dictionary.Keys.ToList());