C#范围和可见性

时间:2015-12-09 11:16:15

标签: c#

我对一个事实感到困惑:

在说明书中说:

  

名称的范围是程序文本的区域   可以引用名称声明的实体而不用   名称的限定。

然后

  

在a中声明的局部变量的范围   local-variable-declaration(第8.5.1节)是其中的块   声明发生。

然后

  

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

所以首先它表示局部变量的范围是块,最后它表示局部变量只有在声明后才可用(如在C / C ++中)。

那么是否有任何矛盾,或者我不太清楚该规范的内容是什么?

2 个答案:

答案 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存在于此范围内,因此您引用的第二条规则正在被遵循。它在被声明之前被使用,因此你引用的第三条规则没有被遵循。不同的编译错误反映了一个不同的规则被打破的事实。