类中的var给出了错误

时间:2010-12-21 06:10:04

标签: c# .net visual-studio class var

  

可能重复:
  Using var outside of a method

class A {
string X;
}
// Proper
class A {
var X;
}
// Improper (gives error)

为什么,我不能在类中使用var类型变量声明,为了实现它可以做些什么或者什么是替代?

在函数/方法中,我可以声明一个var类型变量,那为什么不能,我在课堂上这样做?

感谢。

8 个答案:

答案 0 :(得分:20)

// method variable
var X;

从不有效 - 即使在方法内也是如此;您需要立即初始化以推断类型:

// method variable
var X = "abc"; // now a string

至于带有字段初始化程序的字段不可用的原因:简单地说,规范是这样说的。现在为什么规范说这是另一场辩论......我可以查看annotated spec,但我怀疑他们对于方法变量更加必要 ,逻辑更复杂(重新LINQ等)。此外,它们经常anonymous types一起使用(它们的存在是必需);但是匿名类型不能暴露在公共API上......所以你可能会非常困惑:

private var foo = new { x = 123, y = "abc"}; // valid
public var bar = new { x = 123, y = "abc"}; // invalid

总而言之,我对目前的逻辑感到满意。

答案 1 :(得分:5)

如果确实不知道实例变量将保留的对象类型,请使用object,而不是varvar并不意味着“我不知道”,它意味着“为我推断类型” - 这就是为什么它永远不能用于班级成员。

答案 2 :(得分:4)

因为C#不支持此级别的类型推理。您可以选择使用支持此级别类型推理的语言(如F#)或请求C#团队实现该功能。我有一个非常好的猜测,哪一个你会更幸运...

答案 3 :(得分:3)

var in C#是一个隐式类型的局部变量,用于从给定表达式的RHS推断出类型,需要在编译时解析。当您在类定义中声明一个没有RHS值的var时,编译器无法知道您尝试分配给var的类型。

C#不支持类变量的隐式类型。

答案 4 :(得分:0)

因为var的实际类型是从使用它的上下文中推断出来的。对于字段(类成员变量),没有这样的上下文。

答案 5 :(得分:0)

如果您将var _users = new List<User>()写为字段声明,您可以认为意图非常明显。

问题是并非所有字段声明都包含推断类型所需的赋值。 (您可能希望通过构造函数初始化字段)

var和普通类型声明混合起来看起来像是一种讨厌的汤。因此,这是不可能的。

(至少这是我的猜测)

答案 6 :(得分:0)

是的,var关键字仅允许用于本地变量。

它是在语言中引入的,以便能够处理只存在于本地范围内的匿名类型。由于匿名类型仅限于本地范围,因此仅在本地范围内允许var关键字是有意义的。

此外,如果没有指定值,它永远不会使用var关键字,因为它用于推断数据类型:

var x = "asdf"; // works

var x; // doesn't work

声明变量的常规方法是使用特定的数据类型。如果无法指定数据类型(例如,当类型是匿名的)或类型是超级的时(例如,在值中按字面重复),请使用var关键字。例如:

var x = new { Key = 42, Name = "asdf" };

var y = new System.Text.StringBuilder();

答案 7 :(得分:0)

这完全是因为Build命令。您只能在方法中声明var。编译器首先构建除了方法之外的所有东西,这就是如果在方法中使用它,对象的类型将为编译器清除的原因。乔恩对此有一个很好的答案,但似乎无法找到。