Литеральный формат c# short/long/int?

в C / c# / etc. вы можете сказать компилятору, что литеральное число не то, что кажется (т. е., float вместо double, unsigned long вместо int:

var d = 1.0; // double
var f = 1.0f; // float
var u = 1UL; // unsigned long

etc.

может кто-нибудь точка меня в список? Я специально ищу суффикс для short или Int16.

5 ответов


var d  = 1.0d;  // double
var d0 = 1.0;   // double
var d1 = 1e+3;  // double
var d2 = 1e-3;  // double
var f  = 1.0f;  // float
var m  = 1.0m;  // decimal
var i  = 1;     // int
var ui = 1U;    // uint
var ul = 1UL;   // ulong
var l  = 1L;    // long

думаю, это все... нет литеральных спецификаторов для short/ushort/byte / sbyte


с §2.4.4.2 целочисленные литералы:

тип целочисленного литерала определяется следующим образом:

  • если литерал не имеет суффикса, то есть первый из этих типов, в которых его значение может быть представлено: int, uint, long, ulong.
  • если литерал имеет суффикс U или u, он имеет первый из этих типов, в котором его значение может быть представлено:uint, ulong.
  • если литерал имеет суффикс L или l, он имеет первый из этих типов, в котором его значение может быть представлено:long, ulong.
  • если литерал имеет суффикс UL, Ul, uL, ul, LU, Lu, lU или lu, это типа ulong.

и §2.4.4.3 реальные литералы:

если суффикс реального типа не указан, тип реального литерал двойной. В противном случае суффикс реального типа определяет тип реального литерала следующим образом:

  • настоящий буквальный суффикс F или f типа float. Например, литералы 1f, 1.5f, 1e10f и 123.456F все типа float.
  • настоящий буквальный суффикс D или d типа double. Например, литералы 1d, 1.5d, 1e10d и 123.456D все тип double.
  • настоящий буквальный суффикс M или m типа decimal. Например, литералы 1m, 1.5m, 1e10m и 123.456M все типа decimal. Этот литерал преобразуется в десятичное значение, принимая точное значение и, при необходимости, округляя до ближайшего представимого значения с помощью округления банкира (раздел 4.1.7). Любая шкала, видимая в литерале, сохраняется, если значение не округлено или равно нулю (в последнем случае знак и данные будет 0). Следовательно, буквальное 2.900m будет проанализирован, чтобы сформировать десятичный знак со знаком 0, коэффициент 2900, и масштаб 3.

Если ваша переменная еще не короткая, вы должны привести ее явно:

Object s = (Int16) 1;

нет одного для краткости. Просто используйте short s = 1;.


Если вы хотите избежать приведений типов, которые часто вызывают предупреждения с resharper,short.Parse("1") также может быть альтернативой.