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