可能重复:
在方法之外使用 var
class A {
string X;
}
// Proper
class A {
var X;
}
// Improper (gives error)
为什么,我不能在 Class 中声明 var 类型变量,为了实现它可以做些什么,或者有什么替代方法?
在函数/方法中,我可以声明一个 var 类型变量,那为什么不能,我在课堂上做呢?
谢谢。
可能重复:
在方法之外使用 var
class A {
string X;
}
// Proper
class A {
var X;
}
// Improper (gives error)
为什么,我不能在 Class 中声明 var 类型变量,为了实现它可以做些什么,或者有什么替代方法?
在函数/方法中,我可以声明一个 var 类型变量,那为什么不能,我在课堂上做呢?
谢谢。
// 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
所以总而言之,我对当前的逻辑感到满意。
如果您真的不知道您的实例变量将持有的对象类型,请使用object
,而不是var
。var
并不意味着“我不知道”,而是“为我推断类型”——这就是为什么它永远不能用于班级成员的原因。
因为 C# 不支持这种级别的类型推断。您的替代方法是使用一种语言,例如 F#,它确实支持这种级别的类型推断,或者请求 C# 团队实现该功能。我已经很好地猜到了哪个你会更幸运......
C# 中的 var 是一个隐式类型的局部变量,用于从给定表达式的 RHS 推断类型,需要在编译时解析。当您在类定义中声明一个没有 RHS 值的 var 时,编译器无法知道您尝试分配给 var 的类型。
C# 不支持类变量的隐式类型。
因为 var 的实际类型是从使用它的上下文中推断出来的。对于字段(类成员变量),没有这样的上下文。
这都是因为构建顺序。您只能在方法中声明 var。编译器首先构建除方法之外的所有内容,这就是为什么如果您在方法中使用对象的类型,编译器将清楚它的原因。乔恩对此有一个很好的答案,但似乎找不到。
是的,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();
var _users = new List<User>()
如果您将其编写为字段声明,您可以争辩说意图非常明显。
问题是并非所有字段声明都包含推断类型所需的赋值。(您可能希望通过构造函数初始化字段)
将这两种类型声明和普通类型声明混合var
起来看起来就像一碗讨厌的汤。因此这是不可能的。
(至少这是我的猜测)