声明的差异:" var x = .." vs" var x; x = .."

时间:2014-04-15 11:07:53

标签: c# variables

我是C#的新手,请帮助我理解以下声明之间的区别:

var variable_name = new class_a(); // there is no error and is working fine

var variable_name; 
variable_name = new class_a(); // this line is throwing error

当我把声明重写为

class_a variable_name; 
variable_name = new class_a(); // this is working fine

5 个答案:

答案 0 :(得分:7)

var用于引入implicitly typed local variable。该类型在编译时是已知的,并且是从初始化语句右侧的表达式类型推断出来的。使用您的示例:

var variable_name = new class_a();

编译器推断new class_a()是一个表达式,它产生class_a类型的对象。因此,variable_name被声明为类型class_a。此代码完全等同于

class_a variable_name = new class_a();

如果省略了初始化的右侧,则编译器无法推断出类型。因此编译错误。

答案 1 :(得分:5)

var根据变量初始化的自动推断数据类型。

var i = 3;    // 3 is an int; thus, i is declared as an int.

在第二个示例中,没有指定值,因此无法推断。

var i;        // no data type can be inferred

答案 2 :(得分:4)

当您使用var时,您没有指定datatype,因此您应该为其指定一些值,以便var'变量'成为datatype

只有声明而不是分配才会有帮助,并且在var的情况下会抛出错误。

希望它能清除你的怀疑。

答案 3 :(得分:2)

因为var推断出类型,并且在编译时被评估为静态类型的声明,例如:

var var_name; // The compiler does not know what type var is. It has not been inferred. Error!

var var_name = new class_a(); // The compiler knows var has been inferred as class_a();

等同于......

class_a var_name = new class_a();

下载ILSpy,编译代码,使用ILSpy反映代码,看看您的var声明会发生什么。

答案 4 :(得分:0)

编译器想要在为其分配一块内存时知道变量的类型。第3行做它,然后给它一个值。第一行是好的,因为它在一行上,编译器知道变量应该是class_a的类型,它将分配一个内存并同时给出new class_a()对象的值!
但第二个给你错误是因为它会分配一个没有类型的内存!并且你不能将任何类型的任何对象放在那个特定的记忆中!