我对一个事实感到困惑:
在说明书中说:
名称的范围是程序文本的区域 可以引用名称声明的实体而不用 名称的限定。
然后
在a中声明的局部变量的范围 local-variable-declaration(第8.5.1节)是其中的块 声明发生。
然后
在局部变量的范围内,它是编译时错误 在文本位置之前引用局部变量 局部变量的局部变量声明符。
所以首先它表示局部变量的范围是块,最后它表示局部变量只有在声明后才可用(如在C / C ++中)。
那么是否有任何矛盾,或者我不太清楚该规范的内容是什么?
答案 0 :(得分:4)
没有矛盾。
变量的范围是定义的区域,和只能在声明之后使用。
因此:
{
int someVariable;
...
someVariable = 0;
...
}
有效。鉴于:
{
int someVariable;
...
}
someVariable = 0;
是没有的。而且都不是:
{
someVariable = 0;
...
int someVariable;
}
答案 1 :(得分:3)
名称的范围是程序文本的区域,在该区域内可以引用由名称声明的实体而无需对名称进行限定。
这条规则说明了:
public static class TestClass
{
public static int Value { get; set; }
public static string ValueString
{
get { return TestClass.Value.ToString(); }
}
}
我们可以在TestClass
中省略Value
ValueString
的{{1}}资格,因为Value
在范围内:
public static class TestClass
{
public static int Value { get; set; }
public static string ValueString
{
get { return TestClass.Value.ToString(); }
}
}
但是,如果我们也有:
public static void TestMethod()
{
TestClass.Value = 3;
}
然后我们无法移除TestClass.
部分,因为范围内没有Value
。
在local-variable-declaration(第8.5.1节)中声明的局部变量的范围是声明发生的块。
考虑:
if (true)
{
int x = 3;
}
x++; // CS0103 The name 'x' does not exist in the current context
我们收到CS0103编译错误,因为我们正在尝试在x
不存在的地方使用x
。
在局部变量的范围内,在局部变量的local-variable-declarator之前的文本位置引用局部变量是编译时错误。
if (true)
{
x++; // CS0841 Cannot use local variable 'x' before it is declared
int x = 3;
}
我们在此处收到CS0841错误。 x
存在于此范围内,因此您引用的第二条规则正在被遵循。它在被声明之前被使用,因此你引用的第三条规则没有被遵循。不同的编译错误反映了一个不同的规则被打破的事实。