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

本文关键字:short dectal 视为 int 为什么 | 更新日期: 2023-09-27 18:27:48

在c#中,当我说:时

var s = 0;

s应该是什么类型?它使其成为CCD_ 2。那么CCD_ 3似乎不适用于CCD_ 4和其他类型(?)。

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

看看StackOverflow上的这篇文章。

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

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

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

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

  • 如果文字没有后缀,则它具有可以表示其值的第一种类型:intuintlongulong
  • 如果文字的后缀是Uu,则它具有可以表示其值的第一种类型:uintulong
  • 如果文字的后缀是Ll,则它具有可以表示其值的第一种类型:longulong
  • 如果文字的后缀为ULUluLint320、LULulUlu,则其类型为ulong

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

从上面可以推断,要更改文字的类型,可以在其上添加后缀。例如,文字0u的类型为var0。或者,您可以显式地将文字强制转换为不同的类型;例如:(short)0将导致编译器将该文本视为short

根据规范(§2.4.4.2):

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

因此,较小的类型不会自动推断出来。你可以添加一个铸造来强制这样一个较小的类型:

var s = (short)0;

C#编译器推断类型为Int32。并且不能隐式将其强制转换为shortbyte,因为它们的大小较小,可能会丢失数据。

如果你想让编译器推断short0,你可以:

var s = 0M;