C# 字典<;TKey,TValue>;。KeyCollection`implement`IReadOnlyCollection`?

C# 字典<;TKey,TValue>;。KeyCollection`implement`IReadOnlyCollection`?,c#,.net,dictionary,C#,.net,Dictionary,问题似乎很简单。尽管政府表示: public sealed class KeyCollection : ICollection<TKey>, IReadOnlyCollection<TKey>, IEnumerable<TKey>, ICollection, IEnumerable public sealed class KeyCollection:ICollection, IReadOnlyCollection,IEnumerable,IColl

问题似乎很简单。尽管政府表示:

public sealed class KeyCollection : ICollection<TKey>, 
    IReadOnlyCollection<TKey>, IEnumerable<TKey>, ICollection, IEnumerable
public sealed class KeyCollection:ICollection,
IReadOnlyCollection,IEnumerable,ICollection,IEnumerable
以下代码给出了一个错误:

class MyKeys<T>
{
    readonly Dictionary<T, T> dict = new Dictionary<T, T> ();
    public IReadOnlyCollection<T> Keys { get { return dict.Keys; } set; }
}
classmykeys
{
只读字典dict=新字典();
公共IReadOnlyCollection密钥{get{return dict.Keys;}set;}
}
表示没有从
KeyCollection
IReadOnlyCollection
的转换

此外(在这方面也是法语)说它没有:

[SerializableAttribute]
public sealed class KeyCollection : ICollection<TKey>, 
    IEnumerable<TKey>, ICollection, IEnumerable
[SerializableAttribute]
公共密封类密钥集合:ICollection,
IEnumerable,ICollection,IEnumerable
是哪一个

如果是英文文档中的错误,还有一个额外的问题:


是否有办法将
获取为只读集合?

在撰写此答案时,该答案未包含IReadOnlyCollection接口实现:

public sealed class KeyCollection: ICollection<TKey>, ICollection
公共密封类密钥集合:ICollection,ICollection
从那时起,参考源已更新为现在包含IReadOnlyCollection接口

public sealed class KeyCollection: ICollection<TKey>, ICollection, IReadOnlyCollection<TKey>
公共密封类KeyCollection:ICollection、ICollection、direadonlycollection

您指的是.Net framework 4.5的文档。添加的位置。有


Dictionary.KeyCollection
当前未实现
IReadOnlyCollection

然而,该接口被添加到下一版本的.Net(v4.6)中。使用VS 2015预览版可以看到这一点


您还可以看到,在(下载包含v4.6所有更改的excel文件)

中,虽然它没有实现
IReadOnlyCollection
,但在
IsReadOnly
返回true和
添加
删除
,它是只读的,而且
Clear
所有抛出异常。我一直想知道为什么
Dictionary.KeyCollection
没有实现
ISet
…哦,因此,英文文档可能是最新的。@luk32如果您将版本从4.5更改为更低的版本,它确实表明它没有实现
IReadOnlyCollection
@luk32如果是这种情况(由于错误),我实际上不会感到惊讶,我会说它是
键的只读集合的副本,不是原始的
包装或铸造。将复制原始容器。我错了吗?@luk32,是的,你是对的。如果使用Visual studio 2015并指定.Net framework版本.Net 4.6,则可以执行
IReadOnlyCollection Keys=dictionary.Keys
对于任何未来的读者,请注意上面答案中指向.NET源代码的链接指向更新版本(4.6),该版本确实源自IReadOnlyCollection,但是.NET 4.5版本最初没有包含它。请注意,上面的参考源链接现在指的是更新的.NET代码,其中KeyCollection确实源自IReadOnlyCollection。谢谢。我更新了答案,以反映参考源现在有了接口。
public sealed class KeyCollection: ICollection<TKey>, ICollection
public sealed class KeyCollection : ICollection<TKey>, 
    IEnumerable<TKey>, ICollection, IEnumerable
ReadOnlyCollection<int> readonlyKeys = new ReadOnlyCollection<int>(dictionary.Keys.ToList());