我是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
答案 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()
对象的值!
但第二个给你错误是因为它会分配一个没有类型的内存!并且你不能将任何类型的任何对象放在那个特定的记忆中!