C# 为什么我不能分配BlockingCollection<;T>;到IReadOnlyCollection<;T>;?

C# 为什么我不能分配BlockingCollection<;T>;到IReadOnlyCollection<;T>;?,c#,.net-4.5,C#,.net 4.5,有人能解释一下为什么我会出现下面的编译错误吗?实现IReadOnlyCollectio接口,其他接口没有问题。为什么需要显式强制转换,为什么我不需要对列表执行同样的操作 无法将类型'System.Collections.Concurrent.BlockingCollection'隐式转换为'System.Collections.Generic.IReadOnlyCollection'。存在显式转换(是否缺少强制转换?) IReadOnlyCollection roListItems=new Li

有人能解释一下为什么我会出现下面的编译错误吗?实现
IReadOnlyCollectio
接口,其他接口没有问题。为什么需要显式强制转换,为什么我不需要对
列表
执行同样的操作

无法将类型
'System.Collections.Concurrent.BlockingCollection'
隐式转换为
'System.Collections.Generic.IReadOnlyCollection'
。存在显式转换(是否缺少强制转换?)

IReadOnlyCollection roListItems=new List();//ok(基线检查)
IEnumerable enumBCItems=新建BlockingCollection();//好啊
System.Collections.ICollection colBCItems=new BlockingCollection();//好啊
IReadOnlyCollection roBCItems=新建BlockingCollection();//失败
IReadOnlyCollection roExplicitBCItems=(IReadOnlyCollection)new BlockingCollection();//好啊
编辑

下面是我查看声明时resharper向我展示的内容,因此我感到困惑

// Type: System.Collections.Concurrent.BlockingCollection`1
// Assembly: System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// MVID: BD5F7037-65C4-4C44-8FBC-F45D80D7550F
// Assembly location: C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.dll

public class BlockingCollection<T> : IEnumerable<T>, IEnumerable, ICollection, IDisposable, IReadOnlyCollection<T>
{ ... }
//类型:System.Collections.Concurrent.BlockingCollection`1
//程序集:系统,版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089
//MVID:BD5F7037-65C4-4C44-8FBC-F45D80D7550F
//程序集位置:C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.dll
公共类阻止集合:IEnumerable、IEnumerable、ICollection、IDisposable、IReadOnlyCollection
{ ... }

它没有在.NET 4中实现该接口

public class BlockingCollection<T> : IEnumerable<T>, ICollection, IEnumerable, IDisposable
公共类阻止集合:IEnumerable、ICollection、IEnumerable、IDisposable

它没有在.NET 4中实现该接口

public class BlockingCollection<T> : IEnumerable<T>, ICollection, IEnumerable, IDisposable
公共类阻止集合:IEnumerable、ICollection、IEnumerable、IDisposable

我将该代码块复制到LinqPad中,使用“其他版本”选择器,它工作得很好,似乎该类最初实现的不是
IReadOnlyCollection
。我猜您可能正在使用.NET 4.0?我将该代码块复制到LinqPad中,并且使用“其他版本”选择器运行良好,似乎该类最初实现的不是
IReadOnlyCollection
。我猜您可能正在使用.NET 4.0?而故事的后半部分是.NET 4.5是一个就地升级,因此,即使您以.NET 4.0为目标,代码仍然与.NET 4.5库一起运行,这意味着
IReadOnlyCollection roBCItems=new BlockingCollection()
给出编译器错误,但如果执行显式强制转换,则不会因运行时错误而失败。@trydis您是正确的。Resharper在骗我。请参阅edit,故事的后半部分是.NET 4.5是一个就地升级,因此,即使您以.NET 4.0为目标,代码仍然使用.NET 4.5库运行,这意味着
IReadOnlyCollection roBCItems=new BlockingCollection()
给出编译器错误,但如果执行显式强制转换,则不会因运行时错误而失败。@trydis您是正确的。Resharper在骗我。参见编辑