C# 为什么;var";关键字设置为特定类型?

C# 为什么;var";关键字设置为特定类型?,c#,anonymous-types,C#,Anonymous Types,为什么var a=7会将a类型设置为特定类型(即int而不是byte)?C#编译器是否有任何动态规则/默认值/检查?不清楚“动态”是什么意思-但C#编译器只是遵循规范中规定的规则。对于此类声明: var a = expression; a的类型是表达式的类型。表达式7的类型为int,但已知它也是字节范围内的常数,允许: byte a = 7; 编译。但是,转换为字节的可用性不会改变表达式7的类型,因此int是C编译器用于a类型的 注意,我建议不要对这样的常量使用var。它最终生成的代码可能会

为什么
var a=7
会将
a
类型设置为特定类型(即
int
而不是
byte
)?C#编译器是否有任何动态规则/默认值/检查?

不清楚“动态”是什么意思-但C#编译器只是遵循规范中规定的规则。对于此类声明:

var a = expression;
a
的类型是
表达式的类型。表达式
7
的类型为
int
,但已知它也是
字节范围内的常数,允许:

byte a = 7;
编译。但是,转换为
字节
的可用性不会改变表达式
7
的类型,因此
int
是C编译器用于
a
类型的


注意,我建议不要对这样的常量使用
var
。它最终生成的代码可能会在
int
uint
long
等边界上变得非常混乱。
var
旨在帮助匿名类型,也有助于使代码更具可读性。当它使代码可读性降低时,就不要使用它。

var
不是指“在运行时确定类型”,而是指“使用赋值运算符右侧表达式的结果类型确定类型”。它是在编译时确定的。

有默认值,我不能马上告诉您所有这些。与调用5/7类似,它默认为整数除法。但是如果你使用5/7.0,那么它将使用常规除法。var只是将类型设置为赋值的任何类型,在没有强制转换的情况下,它默认为整数。

根据:

隐式类型的局部变量是强类型的,就像 您自己声明了类型,但编译器确定了类型

:

var关键字指示编译器推断 初始化右侧表达式中的变量 声明


简单来说,编译器将检查分配给变量的数据的最低可用类型,并将所述变量强类型化为该数据类型。

var关键字自动将给定值设置为编译器可以转换的类型。例如:var s=“”;包含字符串并将成为字符串。

它将a设置为表达式类型,因为var是常规类型,并且由于CLR为您处理内存管理,因此它需要并将确定表达式的类型,并将变量设置为该类型。

编译器将处理代码中没有后缀的任何整数文字,作为
int

因此:

byte myByte = 255;
..实际上是将
int
常数255隐式转换为一个字节

这就是为什么
var
被推断为整数的原因。。因为编译器默认使用整数文本

如果要这样做:

var a = 7L;

A的类型是长的,称为。我想他一定在想为什么
var a=7
不将a声明为字节。。。这是因为C#编译器将7视为一个int。@DaveZych确切地说,你抓到我了:)我发现,即
var x=Some_Type
,该类型将是实现所有
Some_Type
接口的类。我可能错了,但这是我自己的简单逻辑。整个谜题其实是关于数字的。。。谢谢你说得更清楚,乔恩@阿德里安克:这里最好的方法不是猜测一种语言是如何工作的,而是阅读它。就我个人而言,我喜欢使用语言规范来获得权威性的答案,但当然也有一些书不那么吓人:)绝对如此!:)我试图在安德鲁的特洛尔森的书中找到答案,这本书我拥有并且喜欢读,但我没有。我也不知道谷歌的任何查询有什么意义,因为我的英语不如我想的那么好。@AdrianK:冒着听起来商业化的风险,我知道C#Depth仔细解释
var
:)
var
根本不是一种类型,CLR的内存管理与此完全无关
var
是一种要求C#编译器为您推断类型的方法。决定类型的不是CLR,而是编译器。