2

IReadOnlyCollectionに変換しようとすると、さまざまなコレクション(すべてがIReadOnlyCollectionインターフェイスを実装する)がコンパイラによって異なる方法で処理されるのはなぜですか?IReadOnlyCollectionでの暗黙的/明示的なキャストの混乱

IReadOnlyCollection<int> a = new List<int>();  // everything fine 
IReadOnlyCollection<int> b = new HashSet<int>(); // compiler wants me to cast 
IReadOnlyCollection<int> c = new Stack<int>();  // compiler wants me to cast 
IReadOnlyCollection<int> d = new Queue<int>();  // compiler wants me to cast 
IReadOnlyCollection<int> e = new LinkedList<int>(); // compiler wants me to cast 
IReadOnlyCollection<int> f = new SortedSet<int>(); // compiler wants me to cast 

私は上記の例ではコンパイルエラーがこれです

を.NET 4.5を使用し、VisualStudioを2015年までだ:

タイプQueue<int>/Stack<int>/...暗黙的IReadOnlyCollection<int>に変換することができません。明示的な変換が存在します。あなたはキャストを逃していますか?

(これは実際のテキストではありませんが、私はあなたが私がここでドイツ語テキストをコピー&ペーストしたくないと考えている。)

私は

IReadOnlyCollection<int> d = new Queue<int>() as IReadOnlyCollection<int>; 

かさえによってキャストを行う場合by

IReadOnlyCollection<int> d = (IReadOnlyCollection<int>)new Queue<int>(); 

すべてが問題ありません。コンパイルやランタイムエラーは発生しません。

+0

IReadOnlyCollectionは、私が知る限り.NET 4.5以降に存在します。 – Kjara

+0

'List'は一般的なクラスです。例えば、 'LinkedList'はListクラスのサブクラスです。それは相続問題についてかもしれませんが、私はその答えも学びたいと思います。 – pilkington

+0

私はこれを再現することはできません - おそらく私たちの一つの手がかりとして、具体的にはコンパイラがエラーや警告と言っていることを教えてください。 –

答えて

2

.NET 4.6以上をターゲットにしている場合、これはコンパイルされます。このバージョンSortedSet(例えば)で

IReadOnlyCollection(右クリックしてチェックし、「定義に移動選択)を実装してい

完全なリストは以下のとおりです。

ISET < T>、ICollectionを< T>、IEnumerableを< T>、IEnumerableを、ICollectionを、ISerializable、IDeserializationCallback、IReadOnlyCollection < T>

4.5で

それだけで実装しています

をISET < T>、ICollectionを< T>、IEnumerableを< T>、ICollectionを、IEnumerableを、ISerializable、IDeserializationCallback

ドキュメントがそう言うならば、(私は'm afraid)ドキュメントが間違っています。

関連する問題