无法将.Net ConcurrentDictionary <k,v>转换为IReadOnlyDictionary <k,v>接口?

时间:2016-03-13 12:20:53

标签: c# interface

我一定错过了一些东西,觉得我必须回到基础知识但{。}}对于.Net 4.5中的ConcurrentDictionary它实现了IReadOnlyDictionary接口(虽然有些成员明确地说),但由于某种原因,我不能将实例强制转换为该接口 - 为什么会这样?

<ul>
  <li style='border: 1px solid black;'>
    <img src="http://i67.tinypic.com/xlcq5w.jpg"/>
    <span> Marvel's Avengers Assemble - S3E1 </br> Adapting to Change</span>
  </li>
</ul>

..为什么会这样?

为了使这一点更清晰:

according to the reference sources

2 个答案:

答案 0 :(得分:7)

您可能使用.NET版本,ConcurrentDictionary未实现此接口。根据我的尝试,它不是由4.6之前的.NET版本实现的:

[SerializableAttribute]
[ComVisibleAttribute(false)]
[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, 
    ExternalThreading = true)]
public class ConcurrentDictionary<TKey, TValue> : IDictionary<TKey, TValue>, 
    ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, 
    IDictionary, ICollection, IEnumerable

在当前的.NET框架版本(4.6.2)中,ConcurrentDictionary实现了它:

[SerializableAttribute]
[ComVisibleAttribute(false)]
[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, 
    ExternalThreading = true)]
public class ConcurrentDictionary<TKey, TValue> : IDictionary<TKey, TValue>, 
    ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, 
    IEnumerable, IDictionary, ICollection, IReadOnlyDictionary<TKey, TValue>, 
    IReadOnlyCollection<KeyValuePair<TKey, TValue>>

答案 1 :(得分:6)

事实证明.Net 4.6的组合是就地更新而Resharper的'导航到源'在这里欺骗了我 - .-

即使该项目的目标是4.5(.1),当导航到ConcurrentDictionary Sources(并且正在离线)时,R#会回退到'反编译'程序集 - 并且.Net 4.6将4.5与它的程序集一起替换为R#,向我提出“不正确的装配”。我错误地认为4.5(.1)已经实现了IReadOnlyCollection接口。 MEH。

那些就地.Net更新有时会让人感到困惑。

哦,好吧 - 感谢Eugene / Yacoub让我三重检查我的来源。