Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我会出错?_C# - Fatal编程技术网

C# 为什么我会出错?

C# 为什么我会出错?,c#,C#,可能重复: 我在c#中有以下代码片段,但它不起作用 static void Main(string[] args) { if (true) { string name = "test"; } else { string name = "hello"; }

可能重复:

我在c#中有以下代码片段,但它不起作用

 static void Main(string[] args)
        {
            if (true)
            {
                string name = "test";
            }
            else
            {
                string name = "hello";
            }
            string name = "world";
        }

它给了我一个错误,说明“name”已经在最后一行声明,但是如果我将其更改为
“name=“some string”
则表示变量名未声明

您需要在IF之前声明name变量

   static void Main(string[] args)
        {
            string name;  
            if (true)  
            {  
                name = "test";  
            }  
            else  
            {  
                name = "hello";  
            }  
            //name = "world";  
        }  
最后一条语句被注释掉,因为它将放弃您在
if
-语句中对变量
name
所做的任何更改。

C#中的作用域规则与C不同-如果在外部作用域中声明变量名,则在内部作用域之后声明变量名并不重要

if
语句之外声明了一个
字符串名
变量,这意味着它在
if/else
的块中可用

编译器正在抱怨,因为您正在
if/else
中声明具有相同名称的其他变量

如果从最后一行中删除类型,则变量仅在
If/else
的内部作用域中声明,但在其外部未知,因此出现“变量名未声明”错误

以下内容将很好地编译:

    static void Main(string[] args)
    {
        string name = "world";
        if (true)
        {
            name = "test";
        }
        else
        {
            name = "hello";
        }
    }
在这里,变量在外部范围中声明,因此在内部范围中可见。您没有在内部范围中重新声明它,因此没有错误


从你的问题上看,这是否是你想要的并不清楚。

这是正确的。代码中某个变量阻止同名变量的部分(称为
声明空间
)与可访问该变量的区域(范围)不同

特别是,声明空间包含声明变量的整个块。因此,外部块中的
name
可以防止此块或嵌套块中的任何其他
name
变量。i、 e.在您的示例中,内部
名称
s和外部
名称
的声明空间重叠,导致编译器错误,因为任何标识符必须在其声明空间内唯一。内部和外部
名称的范围不重叠。并且不能使用超出其范围的变量

这是经过设计的,符合规范要求

查看Eric Lippert关于
声明空间
范围
之间差异的博客:

命名实体的范围是程序文本的区域,在该区域中,以其非限定名称引用该实体是合法的。
相反,声明空间是程序文本的一个区域,其中不允许两个实体具有相同的名称。
简而言之,scope回答了“我在哪里可以使用这个名称?”的问题,而声明空间回答了“这个名称在哪里是唯一的?”


这个场景看起来很熟悉。。。(不,这不是一个bug,它在规范中)@BoltClock和Anthony:结束我的问题这个问题已经被问了一百万次了。请在询问之前搜索,各位@极客,我想你也会觉得这很重要。更好的链接是这一个,因为它实际上回答了被问到的问题:但这与他所拥有的不同,上面他有两个变量,分别位于各自的if块,还有一个位于函数的局部。这不是c,也不是他的代码的反映。如果没有更多的上下文,这可能是OP想要的,还是不…@Oded:非常感谢你的回答…你确定这是编译的吗?我认为您不能在声明之前使用name,即使它在作用域中。@Oded不会编译。在声明局部变量之前,您将遇到一个关于使用它的错误。不,它不会编译,因为名称不在内部块的作用域中。我认为OP知道如何解决该错误,只是惊讶于没有重叠作用域的变量仍然会导致变量重新声明错误。