class A {
string X;
}
// Proper
class A {
var X;
}
// Improper (gives error)
为什么,我不能在类中使用var类型变量声明,为了实现它可以做些什么或者什么是替代?
在函数/方法中,我可以声明一个var类型变量,那为什么不能,我在课堂上这样做?
感谢。
答案 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
,而不是var
。 var
并不意味着“我不知道”,它意味着“为我推断类型” - 这就是为什么它永远不能用于班级成员。
答案 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。编译器首先构建除了方法之外的所有东西,这就是如果在方法中使用它,对象的类型将为编译器清除的原因。乔恩对此有一个很好的答案,但似乎无法找到。