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

时间:2012-03-15 10:04:45

标签: c#

在c#中我说:

var s = 0;

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

4 个答案:

答案 0 :(得分:5)

根据C#语言标准,特别是§2.4.4.2 on integer literals

  

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

     
      
  • 如果文字没有后缀,则其中第一个类型可以表示其值:intuintlongulong。< / LI>   
  • 如果文字后缀为Uu,则其中的第一种类型可以表示其值:uintulong
  •   
  • 如果文字后缀为Ll,则其中的第一种类型可以表示其值:longulong
  •   
  • 如果文字的后缀为ULUluLulLULulUlu,类型为ulong
  •   

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

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

答案 1 :(得分:5)

请看StackOverflow上的这篇文章here

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

var i = 0;
var d = 0d;
var f = 0f;
var l = 0L;
var m = 0m;

答案 2 :(得分:4)

从规范(第2.4.4.2节):

  

如果文字没有后缀,则它具有可以表示其值的第一种类型:intuintlongulong。< / p>

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

var s = (short)0;

答案 3 :(得分:2)

C#编译器将类型推断为Int32。并且您不能隐含地将其投放到shortbyte,因为它们的尺寸较小,您可能会丢失数据。

如果您希望编译器推断decimal,您可以:

var s = 0M;