在方法之外使用 var
Posted
技术标签:
【中文标题】在方法之外使用 var【英文标题】:Using var outside of a method 【发布时间】:2010-12-28 02:53:37 【问题描述】:我想使用var
关键字在我的类中声明一个字段,但var
似乎只在方法内部起作用。
我的代码如下:
public static Dictionary<string, string> CommandList = new Dictionary<string, string>;
我想拥有:
public static var CommandList = new Dictionary<string, string>
这怎么不可能?
【问题讨论】:
您是否收到编译错误?它说什么? 无法解析符号变量。似乎 var 在方法之外根本无法识别。 【参考方案1】:我关于这个主题的文章:
Why no var on fields?
总结一下:
如果我们有“var”字段,那么在分析表达式之前无法确定字段的类型,而这发生在我们已经需要知道字段的类型之后。
如果这些引用中存在长链甚至循环怎么办?所有这些算法都必须在一个***类型信息由它们确定而不是由它们消耗的世界中重写和测试。
如果您有“var”字段,则初始化程序可能是匿名类型。假设该字段是公共的。 CLR 或 CLS 中还没有关于公开匿名类型字段的正确方法的任何标准。
【讨论】:
那篇文章不错。非常深入地了解如何以及为什么。【参考方案2】:来自C# reference
从 Visual C# 3.0 开始,变量 在方法范围内声明 可以有一个隐式类型 var。同样来自The C# Programming Reference
var 只能在同一语句中声明和初始化局部变量时使用;该变量不能初始化为 null,也不能初始化为方法组或匿名函数。 var 不能用于类范围内的字段。它只是不适合您的用途。
它的主要目的是允许在您的代码中支持匿名类型,并具有额外的优势,即允许以简洁的方式指定局部变量。
【讨论】:
【参考方案3】:简短的回答是因为规范说这是不合法的。 ;-)
通常,无论如何,这不是您想要做的。成员的类型应该是IDictionary<string, string>
而不是Dictionary<string, string>
。这是一个小问题,但通常最好在外部可见对象中使用接口,这样您以后可以更改类型而不会影响代码的客户端。编译器只是给你一点点帮助来指导你这个方向。
【讨论】:
-1 它与你使用的是接口还是具体类型无关 -1 同意皮特的观点。该错误与“被推向正确的方向”无关 我没有这么说。我说这是因为规范是这样说的。与 Eric Lippert 不同,我不能就为什么做出选择做出陈述,因为我不在那里。但是,我相信即使它不像下面 EL 描述的那么困难,他们也会因为我列出的原因而选择不这样做。在对象接口的变量中公开实际类型的内部信息是一个坏主意。我在暗示这个问题导致了一个错误的决定。也许太微妙了。 对不起,詹姆斯-也许我误解了你在说什么,但如果是这样,也许可以更清楚地说明。我同意对于公开可见的类型,公开接口而不是实现可能是更好的设计。然而,我读到了“编译器只是给你一点推动来指导你这个方向”。说编译器给你一个关于这个设计问题的提示。它不是。以上是关于在方法之外使用 var的主要内容,如果未能解决你的问题,请参考以下文章