なぜC#の中程度のタイプが調整や反転をサポートしないのですか?
コラボレーションとインバーターの概念により、はコラボレーションの変更を使用して、スーパータイプを受け入れることができます(たとえば、
への割り当て)。ただし、この動作は、IEnumerable<T>
などの値タイプには適用されません。 IEnumerable<string>
IEnumerable<object>
ドキュメントは、この制限は、分散が参照タイプの原理にのみ適用できるためであることを指摘しています。理由を理解するために、ボクシングの概念と調整とインバーターへの影響を探りましょう。 IEnumerable<int>
値タイプはメモリに直接保存され、その値からのロゴの分離はありません。値タイプが参照変数に割り当てられている場合、プロセスはボックスと呼ばれます。このプロセスでは、値タイプは、値タイプのメモリ位置を含むオブジェクトパッケージングデバイスにパッケージ化されます。このパッケージングデバイスにより、値のタイプをオブジェクトと見なすことができます。 パッキングと分散
調整効果を作成するために、CLRは、参照タイプをスーパー型に割り当てたときに表現されないことを確認する必要があります。これは、使用コードが動作しているオブジェクトの正確なタイプを知る必要がないためです。ただし、このタイプの場合、値はメモリに直接保存されます。したがって、値タイプが参照変数に割り当てられている場合、梱包操作が必要です。この梱包操作は、値によって表され、間接性の層を導入します。
識別と正方形の違い
識別とは、オブジェクトをベースタイプまたは派生型に割り当てたときに同じ識別子を維持する機能です。調整された変更では、CLR要求オブジェクトの識別が保持されます。ただし、値のタイプの場合、梱包とボックスの削除操作により、オブジェクトの識別が予期せず変更される場合があります。これは、Synergy Conversion Logoの特性に違反します。
したがって、識別と参照の有効性を確保するために、CLRはコラボレーションとインバーターを参照タイプに制限するだけです。
以上がC#でバリュータイプが共変動または矛盾していないのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。