Я думаю, что все начинается с определения LSP
(Принцип замещения Лискова), который climes:
, если q (x) - свойство, доказуемое об объектах x типа T, то q ( y) должно быть истинным для объектов y типа S, где S является подтипом T.
blockquote>Но типы значений, например
int
, не могут быть замененыobject
вC#
. Доказательство очень просто:int myInt = new int(); object obj1 = myInt ; object obj2 = myInt ; return ReferenceEquals(obj1, obj2);
Это возвращает
false
, даже если мы назначим ту же «ссылку» на объект.
На самом деле, что вы спрашиваете: какой тип задан для целочисленных литералов в C # ?, к которому ответ можно найти в спецификации:
(раздел 2.4.4.2 спецификации 4.0)
Тип целочисленного литерала определяется следующим образом:
- Если литерал не имеет суффикса, он имеет первый из этих типов, в котором его значение может быть представленным: int, uint, long, ulong.
- Если литеральный суффикс U или u, он имеет первый из этих типов, в котором его значение может быть представлено: uint, ulong.
- Если литерал суффикс L или l, он имеет первый из этих типов, в котором его значение может быть представлено: long, ulong.
- Если литерал суффикс UL, Ul, uL, ul, LU, Lu, lU или lu, имеет тип ulong.
Если значение, представленное целым литералом, выходит за пределы диапазона типа ulong, возникает ошибка времени.
blockquote>
Все целые литералы имеют тип int
, поэтому ваша переменная будет int
, если вы не добавите или не добавите явный тип классификатора в конце:
var quick = 65535; // int
var brown = (ushort)65535; // ushort
var fox = 65535L; // long