16

可能重复:
在方法之外使用 var

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

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

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

谢谢。

4

8 回答 8

21
// method variable
var X;

永远无效- 即使在方法内部;您需要立即初始化来推断类型:

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

至于为什么这不适用于具有字段初始化程序的字段:简单地说,规范是这样说的。现在为什么规范这么说是另一个争论......我可以检查带注释的规范,但我的怀疑只是它们对于方法变量更必要,其中逻辑更复杂(重新 LINQ 等)。此外,它们经常匿名类型一起使用(这是它们存在的必要性);但是匿名类型不能在公共 api 上公开......所以你可能会很困惑:

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

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

于 2010-12-21T06:21:11.243 回答
5

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

于 2010-12-21T06:12:29.790 回答
4

因为 C# 不支持这种级别的类型推断。您的替代方法是使用一种语言,例如 F#,它确实支持这种级别的类型推断,或者请求 C# 团队实现该功能。我已经很好地猜到了哪个你会更幸运......

于 2010-12-21T06:12:46.467 回答
3

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

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

于 2010-12-21T06:16:39.777 回答
0

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

于 2010-12-21T06:13:52.957 回答
0

这都是因为构建顺序。您只能在方法中声明 var。编译器首先构建除方法之外的所有内容,这就是为什么如果您在方法中使用对象的类型,编译器将清楚它的原因。乔恩对此有一个很好的答案,但似乎找不到。

于 2010-12-21T07:14:05.143 回答
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();
于 2010-12-21T06:50:59.173 回答
0

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

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

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

(至少这是我的猜测)

于 2010-12-21T06:21:34.993 回答