在编译时隐式输入变量初始化

Ior*_*Man 3 c# var compilation

当我读到关于隐式类型变量时,这个问题出现在我的脑海里.我无法在互联网上找到答案所以决定把它放在野兔身上.

假设我使用'var'关键字声明一个变量.

var i = 10;
Run Code Online (Sandbox Code Playgroud)

编译后,我编译/处理为'整数'我.

现在,我的问题是为什么'i'没有被编译为'short',因为'i'的值非常小以适应'Short'数据类型; 为什么它总是编译成'整数'?

Chr*_*air 6

因为C#规范2.4.4.2规定,如果一些文字没有小数或后缀,这是一个最小的int,uint,long,或ulong可包含它.自然10适合Int32所以选择它.

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

  • 如果文字没有后缀,则它具有这些类型中的第一个,其值可以表示为:int,uint,long,ulong.

C#语言设计者认为,即使10可以适应Int16,使用该变量类型也相对较少; 这种Int32用法将是"现状".

实际上,如果内存服务,无论如何C#中都没有 Int16文字.您必须显式声明并为其分配值Int16才能获得一个值.


有趣的是,我查看了编译的IL代码并声明了一个short s = 10并且int i = 10实际上生成了完全相同的IL ...所以现在我想知道如何管理短路; 也许它们实际上在CLI中作为32位值进行管理.我很想知道是否是这种情况.