Как «примитивные» типы определяются нерекурсивно?

Поскольку 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-битных целых чисел? В более общем плане, как может тип значения (как определение типа значения) включать поле, тип которого сам ? Кажется, что черепахи полностью опущены .

Черная магия?


* Отдельно стоит отметить: правильное ли это слово для типа значения («созданный»)? Я чувствую, что он несет в себе коннотации, напоминающие ссылки; но может это только я. Также, Мне кажется, что я , возможно, задавал этот вопрос раньше - если да, то я забыл, что люди ответили.

** Оба Мартин фон Лёвис и Эрик Липперт ] указали, что это не совсем точный и не соответствующий взгляд на проблему. См. Их ответы для получения дополнительной информации.

*** Хорошо, я понимаю, что на самом деле никто не лжет. Я не имел в виду, что думал, что это ложь ; я подозревал, что это было каким-то чрезмерным упрощением. После того, как я понял (я думаю ) ответ , для меня он стал более понятным.

19
задан Community 23 May 2017 в 11:57
поделиться