if内部的作用域变量

本文关键字:变量 作用域 内部 if | 更新日期: 2023-09-27 18:29:43

可能重复:
C#变量范围

我想如果在不同的范围内,我可以声明两个同名的变量:

namespace IfScope
{
    class Demo
    {
        public static void Main()
        {
            bool a = true;
            if ( a )
            {
                int i = 1;
            }
            string i  = "s";
        }
    }
}

编译器说了别的:

$ csc Var.cs
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
Copyright (C) Microsoft Corporation. All rights reserved.
Var.cs(13,20): error CS0136: A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else

这意味着if内部声明的i在外部可见(这就是我所理解的)

但如果我试着使用它,我就会得到这个。

$ cat Var.cs
namespace IfScope
{
    class Demo
    {
        public static void Main()
        {
            bool a = true;
            if ( a )
            {
                int i = 1;
            }
            i  = "s";
        }
    }
}
Var.cs(13,14): error CS0103: The name 'i' does not exist in the current context

很明显,但这里发生了什么?

if内部的作用域变量

C#要求一个简单的名称在最初使用它的所有块中都有一个含义。

来自规范。

对于给定标识符作为简单名称在表达式或声明符中的每次出现,在该出现的局部变量声明空间内,与表达式或声明器中的简单名称相同的标识符的其他每次出现都必须引用同一实体。此规则确保名称的含义在给定块、switch块、for-、foreach-或using语句或匿名函数中始终相同

标识符i仅在if内部可见,但其作用域是整个方法。这意味着我识别的变量在方法一开始就存在了。这是因为必须在那个时候分配内存。是否在堆栈上分配内存的决定不能在运行时做出,因此条件块中的所有变量都是在控制进入if之前创建的,并且变量存在,直到方法返回。