Так как a struct
в С# состоит из битов его членов, вы не можете иметь тип значения T
, который включает в себя любые поля T
:
// Struct member 'T.m_field' of type 'T' causes a cycle in the struct layout
struct T { T m_field; }
Мое понимание заключается в том, что экземпляр вышеуказанного типа никогда не может быть создан * Любая попытка сделать это приведет к бесконечному циклу создания экземпляра/выделения (что, я думаю, приведет к переполнению стека? **) - или, альтернативно, другой способ взглянуть на него может заключаться в том, что само определение не имеет смысла; возможно, это самопровозглашающая сущность, вроде "Это утверждение ложно".
Любопытно, однако, если вы запустите этот код:
BindingFlags privateInstance = BindingFlags.NonPublic | BindingFlags.Instance;
// Give me all the private instance fields of the int type.
FieldInfo[] int32Fields = typeof(int).GetFields(privateInstance);
foreach (FieldInfo field in int32Fields)
{
Console.WriteLine("{0} ({1})", field.Name, field.FieldType);
}
... вы получите следующий результат:
m_value (System.Int32)
Кажется, мы "лгали" здесь ***. Очевидно, я понимаю, что примитивные типы, такие как int
, double
и т.д., Должны быть определены каким-то особым образом глубоко в недрах С# (вы не можете определить все возможные единицы внутри системы с точки зрения этой системы... можете ли вы? -другая тема, независимо!); Мне просто интересно узнать , что здесь происходит.
Как тип System.Int32
(например) фактически учитывает хранение 32-разрядного целого числа? В более общем смысле, как тип значения (как определение типа значения) включает поле, тип которого сам по себе? Кажется, что черепахи полностью опущены.
Черная магия?
* В отдельном примечании: это правильное слово для типа значения ( "экземпляр" )? Я чувствую, что он носит "ссылочный" коннотации; но, возможно, это только я. Кроме того, мне кажется, что я, возможно, задал этот вопрос раньше - если это так, я забываю, что ответили люди.
** Оба Мартин против Лёвиса и Эрик Липперт указали, что это ни полностью точной, ни соответствующей точки зрения по этому вопросу. См. Их ответы для получения дополнительной информации.
*** Хорошо, я понимаю, что никто на самом деле не лжет. Я не хотел подразумевать, что я думал, что это ложь; мое подозрение было в том, что это было как-то упрощение. После того, как я понял (я думаю) ответ thecoop, это имеет для меня гораздо больше смысла.