IEnumerable<T>
は共変ですが、値型はサポートせず、参照型のみをサポートします。以下の単純なコードは正常にコンパイルされます。
IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
しかし、 からstring
に変更するint
と、コンパイル エラーが発生します。
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
理由はMSDNで説明されています:
差異は参照型にのみ適用されます。バリアント型パラメーターに値の型を指定すると、その型パラメーターは結果として構築される型に対して不変になります。
私が検索したところ、値の型と参照の型の間のボクシングが理由であると述べたいくつかの質問が見つかりました。しかし、なぜボクシングが理由なのか、まだよくわかりません。
共分散と反分散が値の型をサポートしない理由と、ボクシングがこれにどのように影響するかを簡単かつ詳細に説明してください。