Подтвердить что ты не робот

Если Int32 является просто псевдонимом для int, как класс Int32 может использовать int?

Просматривал исходный код .NET Справочного источника .NET Framework, просто для удовольствия. И нашел то, что я не понимаю.

Существует файл Int32.cs с кодом С# для типа Int32. И почему-то это кажется мне странным. Как компилятор С# компилирует код для типа Int32?

public struct Int32: IComparable, IFormattable, IConvertible {
    internal int m_value;

    // ... 
}

Но не является ли это незаконным в С#? Если int является только псевдонимом для Int32, он не должен компилироваться с Ошибка CS0523:

Элемент struct struct 'struct2' типа 'struct1' вызывает цикл в структуре структуры.

Есть ли какая-то магия в компиляторе, или я полностью отключен?

4b9b3361

Ответ 1

не является ли это незаконным в С#? Если "int" - это только псевдоним для "Int32", он не должен компилироваться с ошибкой CS0523. Есть ли какая-то магия в компиляторе?

Да; ошибка в преднамеренно подавляется в компиляторе. Проверка цикла полностью пропущена, если тип, о котором идет речь, является встроенным.

Обычно это незаконно:

struct S { S s; int i; }

В этом случае размер S равен undefined, потому что независимо от размера S, он должен быть равен самому себе плюс размер int. Такого размера нет.

struct S { S s; }

В этом случае у нас нет информации, из которой можно вывести размер S.

struct Int32 { Int32 i; }

Но в этом случае компилятор заранее знает, что System.Int32 - четыре байта, потому что это особый тип.

Кстати, детали того, как компилятор С# (и, если на то пошло, CLR) определяет, когда набор типов структур цикличен, чрезвычайно интересен. В какой-то момент я попытаюсь написать статью в блоге.

Ответ 2

int является псевдонимом для Int32, но структура Int32, на которую вы смотрите, - это просто метаданные, это не реальный объект. Объявление int m_value, возможно, существует только для того, чтобы предоставить структуре соответствующий размер, потому что на самом деле он никогда не упоминается нигде (именно поэтому ему разрешено быть там).

Итак, другими словами, тип компилятора сохраняет это из-за проблемы. В форумах MSDN обсуждается тема

Я подозреваю, что когда компилятор видит "int", он переводит его в "a ссылку на System.Int32 в mscorlib.dll, которая будет разрешена позже", и поскольку он создает mscorlib.dll, он в конечном итоге циклически (но не тот, который может когда-либо вызвать проблемы, потому что m_value никогда не используется). Если это предположение верно, то этот трюк работают только для специальных типов компиляторов.

Далее, можно определить, что структура - это просто метаданные, а не реальный объект, поэтому он не связан одними и теми же рекурсивными определенными ограничениями.