C#范围和可见性

本文关键字:可见性 范围 | 更新日期: 2023-09-27 18:26:16

我对一个事实感到困惑:

规范中说:

名称的范围是它所在的程序文本区域可以引用名称声明的实体名称的限定条件。

然后

在中声明的局部变量的作用域局部变量声明(§8.5.1)是其中发生声明。

然后

在局部变量的范围内,对于引用位于局部变量的局部变量声明符。

所以一开始它说局部变量的作用域是块,最后它说一个局部变量只有在声明之后才可用(就像在C/C++中一样)。

那么,是否存在任何矛盾,或者我不太理解规范中的内容?

C#范围和可见性

没有矛盾。

变量的作用域是定义的区域,只有在声明后才能使用。

因此:

{
    int someVariable;
    ...
    someVariable = 0;
    ...
}

有效。鉴于:

{
    int someVariable;
    ...
}
someVariable = 0;

不是。两者都不是:

{
    someVariable = 0;
    ...
    int someVariable;
}

名称的范围是程序文本的区域,在该区域内,可以引用名称声明的实体,而无需对名称进行限定。

该规则规定,给定:

public static class TestClass
{
  public static int Value { get; set; }
  public static string ValueString
  {
    get { return TestClass.Value.ToString(); }
  }
}

我们可以省略ValueStringValueTestClass资格,因为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

局部变量声明(§8.5.1)中声明的局部变量的范围是发生声明的块。

考虑:

if (true)
{
  int x = 3;
}
x++; // CS0103 The name 'x' does not exist in the current context

我们得到CS0103编译错误,因为我们试图在不存在x的地方使用x

在局部变量的范围内,在局部变量声明符之前的文本位置引用局部变量是一个编译时错误。

if (true)
{
  x++; // CS0841 Cannot use local variable 'x' before it is declared
  int x = 3;
}

在这里,我们得到了一个CS0841错误。x存在于此作用域中,因此将遵循您引用的第二条规则。不过,在声明之前就已经使用了它,所以没有遵循您引用的第三条规则。不同的编译错误反映了一个不同的规则被打破的事实。