2016-06-23 15 views
0

誰かが以下のコンパイルエラーが発生する理由を説明していただけますか? BlockingCollection<T>IReadOnlyCollectio<T>インターフェイスを実装しており、他のインターフェイスに問題はありません。なぜ明示的なキャストの必要性、なぜ私はList<T>のために同じことをしなければならないのですか?なぜ私はBlockingCollection <T>をIReadOnlyCollection <T>に割り当てることができませんか?

'System.Collections.Concurrent.BlockingCollection<string>'から'System.Collections.Generic.IReadOnlyCollection<string>'に暗黙的に変換できません。以下は、明示的な変換(あなたはキャストが欠けている?)が存在

IReadOnlyCollection<string> roListItems = new List<string>(); // ok (baseline check) 

IEnumerable<string> enumBCItems = new BlockingCollection<string>(); // ok 
System.Collections.ICollection colBCItems = new BlockingCollection<string>(); // ok 
IReadOnlyCollection<string> roBCItems = new BlockingCollection<string>(); // fail 
IReadOnlyCollection<string> roExplicitBCItems = (IReadOnlyCollection<string>)new BlockingCollection<string>(); // ok.... 

編集

は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> 
{ ... } 
+1

.NETでそのインタフェースを実装しておらず、それは他のバージョン 'セレクタを用いた微細 –

+3

働いクラスがもともと 'IReadOnlyCollection'を実装したようには見えません。 .NET 4.0を使用しているかもしれないと思いますか? –

答えて

6

私はLinqPadにそのコードブロックをコピー4.

public class BlockingCollection<T> : IEnumerable<T>, ICollection, IEnumerable, IDisposable 

https://msdn.microsoft.com/en-us/library/dd267312(v=vs.100).aspx

+2

そして物語の後半は.NET 4.5がインプレースアップグレードであるため、.NET 4.0をターゲットにしていても、コードは引き続き.NET 4.5ライブラリで実行されます。つまり、IReadOnlyCollection roBCItems = new BlockingCollection ()コンパイラエラーですが、明示的キャストを実行すると、ランタイムエラーで失敗しません。 –

+0

@trydisあなたは正しいですか? Resharperは私に数字を引っ張っていた。編集を参照 – jasper

関連する問題