Поскольку struct
в C# состоит из битов своих членов, у вас не может быть типа значения 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
и т. д., должны быть определены каким-то особым образом глубоко в недрах C# (вы не можете определить все возможные единицы внутри системы в терминах этой системы... не так ли?— другая тема, независимо!); Мне просто интересно знать, что здесь происходит.
Как тип System.Int32
(например) на самом деле учитывает хранение 32-битного целого числа? В более общем смысле, как тип значения (как определение типа значения) может включать поле, тип которого сам по себе? Это только кажется, что черепахи идут вниз.
Черная магия?
*Отдельное примечание: подходит ли это слово для типа значения ("экземпляр")? Я чувствую, что это несет в себе «референсные» коннотации; но, может быть, это только я. Кроме того, мне кажется, что я мог задавать этот вопрос раньше — если да, то я забываю, что люди отвечали.
**Оба Мартин против Лёвиса и Эрик Липперт указали что это не совсем точно и не является подходящим взглядом на проблему. См. их ответы для получения дополнительной информации.
***Хорошо, я понимаю, что на самом деле никто не лжет. Я не имел в виду, что считаю это ложным; я подозревал, что это было каким-то чрезмерным упрощением. После того, как я понял (я думаю) ответ thecoop, мне он кажется более логичным.