8
public struct Unit
{
    Unit u;
}

原因:

タイプ「Unit」の構造体メンバー「Unit.u」により、構造体レイアウトにサイクルが発生します。

だが

public class Unit
{
    Unit u;
}

コンパイルします。私は私が推測する問題を理解しています。Unitオブジェクトを参照すると、別のメンバーなどを初期化する必要があるため、無限のサイクルが形成さUnitれます。しかし、なぜコンパイラは問題を制限するのstructsですか?問題は長続きしclassませんか?私は何かが足りないのですか?

4

4 に答える 4

21

問題はレイアウトです。

Unitが構造体の場合、aのUnit値には同じ型 (したがって同じサイズ) の別の値が無限に含まれている必要があります。それ無理。他のフィールドがUnitなければ、のフィールドはメモリを占有しないはずなので、それ自体に含めることができると主張できると思いますが、CLR の動作により、すべての構造体が少なくとも 1 バイトを占めるようになると思います...

Unitがクラスの場合、オブジェクトは別のオブジェクトへの参照Unitのみを含む必要があります。ストレージの問題はなく、最初は値を null にすることができます。Unit

このように考えてみてください: 同じ設計図から作られた別の家を含む家を持つことはできませんが、同様の家の住所が書かれた紙を含む家を持つことは確かにできます...

于 2013-01-13T23:05:59.010 に答える
3

クラスは参照型なので、このclass例では、別のインスタンスへの参照を保存するだけでよいという違いがあると思います。値型である の場合struct、構造全体を再度含める必要があるため、無限ループになります。

于 2013-01-13T23:07:10.743 に答える
2

structは値で自動的に初期化されるため、この例では、値Unitには値が含まれ、Unit値が含まれ、Unit値が含まれますUnit...

あなたの例は、無限回帰を持たないclassへの参照のみを初期化します。nullただし、次のようにすると、同様の問題が発生します。

class Unit
{
   Unit mUnit = new Unit();
}

ここで、 aをUnit構築するUnitとa が構築され、 a が構築されUnitます。この場合、Unitオブジェクトをインスタンス化しようとすると、ランタイム スタック オーバーフロー例外が発生します。

null許容型を使えば回避できるのではないかと思ったのですstructが、まだ問題が残っています。これは、に設定しても nullablestructがまだインスタンス化されているためだと思いますnull

于 2013-01-13T23:15:01.907 に答える
1

Structですのでvalue typeUnit値をそれ自体として保持できますか? これはありえないと思います。

でも、あるときUnitclassclassあるreference type。オブジェクトは別のオブジェクトへの参照Unitを保持できます。それは結構です。Unit

于 2013-01-13T23:07:18.110 に答える