所以,就一个真正问题的问题而言,这可能不是一个非常好的问题,但它让我烦恼,我找不到答案,所以我认为这是一个问题。
var
的特异性是什么?其上的MSDN reference表明了以下内容:
隐式类型的局部变量是强类型的,就像你自己声明了类型一样
Bur似乎没有说任何类型的强类型。例如,如果我有以下内容:
var x = new Tree();
但是我不会调用Tree
的任何方法,x
是否仍然强烈输入tree
?或者我可以拥有以下内容吗?
var x = new Tree();
x = new Object();
我猜这是不允许的,但我现在无法访问编译器,我真的想知道是否有任何警告允许出现意外行为,如上所述。
答案 0 :(得分:10)
答案 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}}