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