为什么var a = 7;
会将a
类型设置为某种类型(即int
而不是byte
)? C#编译器是否有任何规则/默认/检查?
答案 0 :(得分:14)
目前尚不清楚“动态”是什么意思 - 但C#编译器只是遵循规范中规定的规则。对于那种声明:
var a = expression;
a
的类型是expression
的类型。表达式7
的类型为int
,但也已知为byte
范围内的常量,允许:
byte a = 7;
编译。转换为byte
的可用性不会更改表达式7
的类型,因此int
是C#编译器使用的类型a
。
请注意,我建议不要将var
用于此类常量。它最终会导致代码在int
,uint
,long
等边界处变得非常混乱。var
旨在帮助匿名类型,并帮助使代码更多可读。当它使代码 less 可读时,就不要使用它。
答案 1 :(得分:2)
编译器会将代码中没有后缀的任何整数文字视为int
。
所以这个:
byte myByte = 255;
..实际上是隐式地将int
常量255转换为字节。
这就是为什么var
被认为是一个整数...因为编译器默认使用整数文字。
如果你这样做:
var a = 7L;
A类型为long
。
答案 2 :(得分:1)
有默认值,我无法告诉你所有这些。类似于如果你调用5/7它默认为整数除法。但如果你做5 / 7.0那么它会做常规分割。 var只是将类型设置为指定值的类型,在没有强制转换的情况下,默认情况下它是一个整数。
答案 3 :(得分:0)
var
并不意味着"在运行时确定类型",它意味着"使用赋值运算符右侧表达式的结果类型来确定类型。 "它是在编译时确定的。
答案 4 :(得分:0)
根据manual:
隐式类型的局部变量是强类型的,就像你一样 我自己声明了类型,但编译器确定了类型。
and:
var关键字指示编译器推断出类型 来自初始化右侧表达式的变量 言。
简单而言,编译器将检查分配给变量的数据的最低可用类型,并将该变量强类型为该数据类型。
答案 5 :(得分:0)
var关键字自动将给定值设置为编译器可以转换的类型。例如:var s ="&#34 ;;包含一个字符串,并将成为一个字符串。
答案 6 :(得分:-2)
它将a设置为表达式类型,因为var是一般类型,因为CLR为您处理所需的内存管理,并将确定表达式的类型并使变量成为该类型。