为什么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和其他类型(?)。
看看StackOverflow上的这篇文章。
您可以为所有数字指定后缀。
var i = 0;
var d = 0d;
var f = 0f;
var l = 0L;
var m = 0m;
根据C#语言标准,特别是关于整数文本的§2.4.4.2:
整数文字的类型确定如下:
- 如果文字没有后缀,则它具有可以表示其值的第一种类型:
int
、uint
、long
、ulong
- 如果文字的后缀是
U
或u
,则它具有可以表示其值的第一种类型:uint
、ulong
- 如果文字的后缀是
L
或l
,则它具有可以表示其值的第一种类型:long
、ulong
- 如果文字的后缀为
UL
、Ul
、uL
、int32
0、LU
、Lu
、lU
或lu
,则其类型为ulong
第一条规则是这里需要应用的全部规则。文字0
没有后缀,可以表示为类型int
(或者,在BCL术语中,Int32
),所以这就是它的类型。
从上面可以推断,要更改文字的类型,可以在其上添加后缀。例如,文字0u
的类型为var
0。或者,您可以显式地将文字强制转换为不同的类型;例如:(short)0
将导致编译器将该文本视为short
。
根据规范(§2.4.4.2):
如果文字没有后缀,则它具有可以表示其值的第一种类型:
int
、uint
、long
、ulong
。
因此,较小的类型不会自动推断出来。你可以添加一个铸造来强制这样一个较小的类型:
var s = (short)0;
C#编译器推断类型为Int32
。并且不能隐式将其强制转换为short
或byte
,因为它们的大小较小,可能会丢失数据。
如果你想让编译器推断short
0,你可以:
var s = 0M;