2009-12-18 112 views
17

我想使用var关键字在我的类中声明一个字段,但var似乎只能在方法内部工作。在方法外使用var

我的代码看起来像:

public static Dictionary<string, string> CommandList = new Dictionary<string, string>{}; 

,我想有:

public static var CommandList = new Dictionary<string, string> 

为什么这是不可能的?

+0

你有编译错误吗?它说什么? – 2009-12-18 17:01:23

+0

无法解析符号var。 看来,var只是在方法之外无法识别。 – 2009-12-18 17:03:06

回答

30

我关于这个问题的文章:

Why no var on fields?

总结:

  1. 如果我们有“VAR”领域则无法确定该字段的类型,直到表达分析,而这种情况发生在我们已经需要知道该字段的类型之后。

  2. 如果这些参考文献中存在长链或甚至周期会怎么样?所有这些算法都必须在顶级类型信息正在确定的世界中重写和测试它们而不是被它们消耗它们。

  3. 如果您有“var”字段,那么初始值设定项可以是匿名类型。假设该字段是公开的。在CLR或CLS中还没有关于揭示匿名类型字段的正确方法的标准。

+3

那篇文章是好东西。关于如何和为什么非常深入。 – 2009-12-18 17:24:54

0

简短的答案是因为规范说它不合法。 ;-)

一般来说,这不是你想要做的。成员的类型应该是IDictionary<string, string>而不是Dictionary<string, string>。这是一个小的问题,但通常最好在外部可视对象中使用接口,以便稍后更改类型而不影响代码的客户端。编译器只是给你一些小小的指示来指导你这个方向。

+5

-1它与您是否使用界面或具体类型无关。 – 2009-12-18 17:15:51

+4

-1同意Pete。这个错误与“向正确的方向推进”无关。 – 2009-12-18 17:20:45

+0

我没有说这是错误的。我说这是因为规范这么说的。与Eric Lippert不同,我无法说明为什么选择是因为我不在那里。然而,我相信即使它不像EL所描述的那样困难,他们也不会选择我列出的理由。将实际类型的内部信息暴露在对象接口中的变量中是个不错的主意。我暗示这个问题导致了一个不好的决定。也许太微妙了。 – 2009-12-18 17:24:12

6

C# reference

  • 在Visual C#3.0开始,变量被在方法范围 声明 可以具有隐式类型变种。
The C# Programming Reference

  • VAR

    此外,当一个局部变量声明,并在同一语句中初始化才能使用;该变量不能被初始化为空,或者方法组或匿名函数。

  • var不能用于类作用域的字段。

它只是不打算用于你的想法。

它的主要目标是允许匿名类型在您的代码中的支持,以及允许指定局部变量的一种很好的简洁方式的附加优点。

+1

+1用于引用规范并给出参考 – jcoder 2009-12-18 17:17:20