Поскольку 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 , мне стало гораздо понятнее.