var的特异性是什么?

时间:2012-12-13 20:23:26

标签: c# var

所以,就一个真正问题的问题而言,这可能不是一个非常好的问题,但它让我烦恼,我找不到答案,所以我认为这是一个问题。

var的特异性是什么?其上的MSDN reference表明了以下内容:

  

隐式类型的局部变量是强类型的,就像你自己声明了类型一样

Bur似乎没有说任何类型的强类型。例如,如果我有以下内容:

var x = new Tree();

但是我不会调用Tree的任何方法,x是否仍然强烈输入tree?或者我可以拥有以下内容吗?

var x = new Tree();
x = new Object();

我猜这是不允许的,但我现在无法访问编译器,我真的想知道是否有任何警告允许出现意外行为,如上所述。

6 个答案:

答案 0 :(得分:10)

它强烈地键入右侧表达式的类型:

  

var关键字指示编译器从初始化语句右侧的表达式推断变量的类型。

来自here

答案 1 :(得分:6)

它与等号右侧的类型相关联,所以在这种情况下,它相当于:

Tree x = new Tree();

无论与Tree绑定的接口或基类是什么。如果您需要x为较低类型,则必须具体声明,例如:

Plant x = new Tree();
// or
IHasLeaves x = new Tree();

答案 2 :(得分:2)

是的,在您的示例中,x被强类型为Tree just as if you had declared the type yourself

您的第二个示例无法编译,因为您正在重新定义x

答案 3 :(得分:2)

不,如果输入Tree x = new Tree();完全相同。显然,编译器可以做的唯一明确的推断是右侧表达式的确切类型,因此它不会突然变为ITree x

所以这不起作用:

Tree x = new Tree();
x = new Object(); //cannot convert implicitly

如果您感到好奇,dynamic更接近您期望的行为。

dynamic x = new Tree();
x = new Object(); 

答案 4 :(得分:1)

在示例中:

var x = new Tree();

相同
Tree x = new Tree();

我发现使用“var”总是更好,因为它有助于代码重新分解。

另外,添加,

var x = new Object();
由于您无法两次声明变量,因此在同一范围内的

会破坏编译。

答案 5 :(得分:0)

var既不是一种类型,也不会使变量变得特别。它告诉编译器通过分析赋值运算符右侧的初始化表达式来推断变量AT COMPILE TIME的类型。

这两个表达式是等价的:

Tree t = new Tree();

var t = new Tree();

我个人更喜欢在右侧明确提到类型名称时使用var,或者当确切类型复杂且与LINQ查询返回的结果不相关时更喜欢使用var x = new Dictionary<string, List<int>>(); 。这些LINQ结果通常只是进一步处理的中间结果:

Dictionary<string, List<int>> x = new Dictionary<string, List<int>>();

比以下声明更容易阅读,但非常清楚:

var query = someSource
    .Where(x => x.Name.StartsWith("A"))
    .GroupBy(x => x.State)
    .OrderBy(x => x.Date);
query

此处IOrderedEnumerable<IGrouping<string, SomeType>>的类型为var。谁在乎?


如果类型名称没有显示在右侧并且很简单,那么我更愿意明确地编写它,因为它不会简化使用int y = 7; string s = "hello"; 的任何内容:

var

原因是,如果您创建匿名类型,则必须使用var z = new { Name = "Coordinate", X = 5.343, Y = 76.04 }; ,因为您没有类型名称:

var

SELECT Name, Date FROM Person 关键字与LINQ一起引入,以简化其使用并允许动态创建类型以模拟使用SQL的方式:

var result = DB.Persons.Select(p => new { p.Name, p.Date });
{{1}}