動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About
C#

定石5:共変・反変の罠— IEnumerable<T>は共変・IList<T>は不変

出典: C# のコレクション選び — 配列 / List / IEnumerable / IList の使い分け完全ガイド定石5:共変・反変の罠— IEnumerable<T>は共変・IList<T>は不変

定石5:共変・反変の罠— IEnumerable<T>は共変・IList<T>は不変 (csharp)#9af670d7acd0
// ✅定石5:共変(covariance)の例
class Animal { }
class Dog : Animal { }
 
// ✅ IEnumerable<Dog>はIEnumerable<Animal>に代入可能(共変・out T)
IEnumerable<Dog> dogs = new List<Dog> { new Dog(), new Dog()};
IEnumerable<Animal> animals = dogs;   // OK
//「Dogの列挙はAnimalの列挙としても扱える」
 
// ❌ List<Dog>はList<Animal>に代入できない(不変)
List<Dog> dogList = new List<Dog>();
// List<Animal> animalList = dogList;   //コンパイルエラー
//「List<Animal>にCatをAddされる可能性があるので不可」
 
// ❌ IList<Dog>もIList<Animal>に代入できない(不変)
IList<Dog> dogIList = new List<Dog>();
// IList<Animal> animalIList = dogIList;   //コンパイルエラー
//「IList<Animal>.Add(new Cat())ができてしまうので不可」
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
  • id: #9af670d7acd0
  • lines: 18
  • extracted: 2026-06-10

Source収録記事

この snippet は記事の「定石5:共変・反変の罠— IEnumerable<T>は共変・IList<T>は不変」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。

同じ記事から

4
図鑑トップ