Как вы, вероятно, понимаете, структура не может иметь циклическую ссылку, потому что, когда вы размещаете структуру в памяти, вы должны включить хранение внутри структуры для каждого из ее членов. Циклическое определение требует бесконечного количества памяти:
- Структура с двумя
Int32
членами требует 8 байтов (2 * sizeof(Int32)
); аналогично, структура с четырьмя Int32
членами требует 16 байтов.
- Если структура
S
имеет два Int32
члена плюс один S
член, для этого потребуется 2 * sizeof(Int32) + sizeof(S)
.
- Но если
sizeof(S) = 2 * sizeof(Int32) + sizeof(S)
, у нас бесконечная рекурсия, и мы не можем выделить память для структуры; поэтому рекурсивные определения являются незаконными.
Теперь предположим, sizeof(Nullable<T>) = sizeof(bool) + sizeof(T)
(см. Ответ Джона Скита). Рассмотрим структуру S
с таким определением:
struct S
{
int _someField;
S? _someOtherField;
}
В этом случае sizeof(S) = sizeof(Int32) + sizeof(Nullable<S>)
.
Заменив sizeof(Nullable<S>)
на sizeof(bool) + sizeof(S)
, мы получим
sizeof(S) = sizeof(Int32) + sizeof(bool) + sizeof(S)
Опять бесконечная рекурсия.