[解決済み] 共分散と共分散が値型をサポートしない理由
質問
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 :
Variance は参照型にのみ適用されます。Variant 型パラメータに値型を指定すると、その型パラメータは結果として構築される型に対して不変になります。
検索してみたところ、いくつかの質問で、その理由を述べているのは 値型と参照型の間のボックス化 . しかし、なぜボクシングが理由なのか、まだよく分かっていないのです。
どなたか、共分散と共分散が値型をサポートしない理由をわかりやすく丁寧に説明してください。 ボクシング というのはどういうことでしょうか?
解決方法は?
基本的に、分散はCLRがいかなる
表現上の変更
を値に追加します。参照はすべて同じに見える。
IEnumerable<string>
として
IEnumerable<object>
ネイティブコード自身は、インフラが確実に有効であることを保証している限り、あなたが値に対して何をしているかを知る必要は全くありません。
値型の場合、それはうまくいきません。
IEnumerable<int>
として
IEnumerable<object>
の場合、シーケンスを使用するコードは、ボクシング変換を実行するかどうかを知る必要があります。
Eric Lippert の 表現と同一性についてのブログ記事 をご覧ください。
EDIT: Ericのブログ記事を自分で読み直してみると、少なくとも、この記事は アイデンティティ とはいえ、この2つはリンクしています。特に
このため、インターフェイス型やデリゲート型の共変換や共変換では、変化する型引数がすべて参照型であることが要求されます。変化する参照変換が常に同一性保持であることを保証するために、型引数を含む変換のすべてもまた同一性保持でなければなりません。型引数のすべての非自明な変換が同一性保持であることを保証する最も簡単な方法は、それらを参照変換であるように制限することです。
関連
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] 共分散と共分散の実世界の例
-
[解決済み] 共分散、不変化、共分散をわかりやすく解説?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み】Nullableオブジェクトは値を持たなければならない?