C#编译器如何解释var关键字指定的对象?

时间:2010-02-18 12:27:32

标签: c# types keyword

C#编译器如何解释var关键字指定的对象?我们何时必须使用此关键字?

4 个答案:

答案 0 :(得分:6)

有时您需要使用var,例如,在使用匿名类型时,例如在LINQ查询中:

var results = context.People.Select(p => new {p.PersonID, p.Name});

在那里看到新的{}行?那将返回一个在编译时生成的类。由于此类没有名称,因此在代码中引用它的唯一方法是使用“var”。这减少了你必须为LINQ结果集创建吨和吨的特殊用途类。

在幕后,无论你是将var用作另一种类型的简写,还是使用匿名类型,你仍然在进行静态的编译时类型检查。未使用动态类型。编译器按字面意思确定编译时应该是什么类型,所以程序如:

var i = 12;
i = i + "foo!";

不会编译。

答案 1 :(得分:4)

var (C# Reference)

从Visual C#3.0开始,在方法范围声明的变量可以具有隐式类型var。隐式类型的局部变量是强类型的,就像您自己声明了类型一样,但编译器确定了类型。

答案 2 :(得分:2)

在Var声明中,

  

编译器从中推断出类型   分配值

on

var a = 100;     // compiler assumes a is a integer
var b = "test";  // compiler assumes b is a string

为什么我们需要它们(为什么我们不能直接使用对象)

因为对象不强制执行类型安全

  object objtest = 1;
  objtest = "test";

这很好。

但var强制执行类型安全

  var a = 100;    
  a= "test";  

这不会编译,并且会给出编译时错误。

我们可以使用它们

  • Linq查询返回匿名类型
  • 您想要定义类型安全变量(简单)的任何地方。而不是写作 像这样的东西。

   RootClass rt = new RootClass ();
   List<RootClass > rt = new List<RootClass >();

你可以这样写

var aaaaaa = new RootClass ();
var ls = new List<RootClass>();

答案 3 :(得分:1)

如果你的意思是变量声明中使用的“var”关键字,那么就没有“var type”这样的东西。这个“var”被解释(在编译时)作为从赋予变量的表达式推断出的类型。