为什么c#将0视为int而不是short/decimal等?

Dha*_*jay 5 c#

在c#当我说:

var s = 0;
Run Code Online (Sandbox Code Playgroud)

应该是什么类型的s?它成功了int32.然后似乎var不适用于类似short和其他类型(?).

Cod*_*ray 5

根据C#语言标准,特别是关于整数文字的§2.4.4.2:

整数文字的类型确定如下:

  • 如果文字没有后缀,它具有第一这些类型的,其中它的值可以表示的:int,uint,long,ulong.
  • 如果文字后缀为Uu,则它具有这些类型中的第一个,其值可以表示为:uint,ulong.
  • 如果文字后缀为Ll,则它具有这些类型中的第一个,其值可以表示为:long,ulong.
  • 如果文字是由后缀UL,Ul,uL,ul,LU,Lu,lU,或lu,它的类型的ulong.

第一条规则就是这里需要应用的所有规则.文字0没有后缀,可以表示为类型int(或者,以BCL术语表示Int32),因此它具有类型.

正如您可以从上面推断的那样,要更改文字的类型,您可以为其添加后缀.例如,文字0u将是类型uint.或者,您可以显式地将文字转换为其他类型; 例如:(short)0会导致编译器将文字视为一个short.


小智 5

看看这个帖子在这里在StackOverflow上.

您可以为所有数字指定后缀.

var i = 0;
var d = 0d;
var f = 0f;
var l = 0L;
var m = 0m;
Run Code Online (Sandbox Code Playgroud)


Joe*_*oey 4

根据规范(\xc2\xa7 2.4.4.2):

\n\n
\n

如果文字没有后缀,则它具有可以表示其值的第一种类型:int, uint, long, ulong

\n
\n\n

因此不会自动推断出较小的类型。您可以添加强制转换来强制使用较小的类型:

\n\n
var s = (short)0;\n
Run Code Online (Sandbox Code Playgroud)\n