Что такое int в С#?

Что такое int в С#? Это ключевое слово или класс, производный от system.ValueTypes? Если это ключевое слово, то как компилируются следующие строки

int i = new int(); // If int is not a class then how does it have a default constructor

Console.WriteLine(i.ToString()); // If int is not a class then how does it have member functions

Если int — это класс, то почему нет необходимости всегда инициализировать его с помощью new? Как компилируется следующая строка?

int i = 8;

person user1232138    schedule 21.07.2012    source источник
comment
Кто сказал, что структуры или типы значений не могут иметь методы? Это какой-то бред про Java :) int это System.Int32, который является типом struct. (Чтобы упростить жизнь, компилятор знает о различных литеральных конструкциях, таких как целые числа, значения с плавающей запятой и строки. Однако это фиксированный набор. Например, для GUID нет литерала, поэтому требуется new Guid(string).)   -  person    schedule 21.07.2012
comment
Все типы значений могут иметь методы, Java — глупое исключение.   -  person Ry-♦    schedule 21.07.2012
comment
int i = 8 компилируется по той же причине, что и string foo = "bar". 8 — это литерал типа int, точно так же, как "bar" — это литерал типа string.   -  person cdhowie    schedule 21.07.2012
comment
Хорошо, если int является псевдонимом для struct System.Int32, то как он наследуется от класса System.Object??   -  person user1232138    schedule 21.07.2012
comment
@ user1232138 Каждый struct является подтипом ValueType, а ValueType является подтипом object. В отличие от class другие подтипы не могут быть указаны с помощью struct (хотя интерфейсы могут быть указаны). Вот как определяется дерево типов в C#/CLR. См. stackoverflow.com /questions/11461789/ Конечно, это еще не все. object x = 1 блокирует (ключевое слово) значение int, например.   -  person    schedule 21.07.2012
comment
Но в C# структуры не могут наследоваться от других структур или классов, тогда как int наследуется от System.Object..   -  person user1232138    schedule 21.07.2012
comment
@ user1232138 Могут. И они делают. Но у них фиксированная иерархия. То есть существует значение по умолчанию: struct -> (abstract class) System.ValueType -> (class) System.Object, которое нельзя изменить, так же как нельзя сделать класс не в конечном счете производным от object. Каждое значение struct является ValueType. Каждый ValueType является object. Таким образом, каждое значение struct является object.   -  person    schedule 21.07.2012
comment
(К сожалению, я имел в виду: ValueType, абстрактный класс, является подтипом object.)   -  person    schedule 21.07.2012


Ответы (3)


int — это псевдоним типа CTS System.Int32 структура.

Прочтите ответ SO, опубликованный Эриком Липпертом - Как ValueTypes выводятся из Object (ReferenceType) и остаются ValueTypes?

person kv-prajapati    schedule 21.07.2012
comment
Хорошо, если int является псевдонимом для struct System.Int32, то как он наследуется от класса System.Object?? - person user1232138; 21.07.2012

int — это ключевое слово, являющееся псевдонимом для типа значения (struct) System.Int32.

Будучи обычным типом значения, я считаю, что его наследование System.Object -> System.ValueType -> System.Int32.

Поскольку int имеет буквенное обозначение, как строки и другие числовые типы, вы можете создавать его экземпляры без new.

person Gabe    schedule 21.07.2012
comment
Если int является псевдонимом для struct System.Int32, то как он наследуется от класса System.Object?? - person user1232138; 21.07.2012
comment
@ user1232138: Все типы значений имеют System.Object в качестве косвенного базового класса. - person Gabe; 21.07.2012

Чтобы объяснить код с помощью кода:

Console.WriteLine(typeof(int) == typeof(Int32)); // Outputs: True
Console.WriteLine(typeof(int).Name); // Outputs: Int32
person Luis Perez    schedule 21.07.2012