我在c#中有以下代码段,但是无法正常工作
static void Main(string[] args)
{
if (true)
{
string name = "test";
}
else
{
string name = "hello";
}
string name = "world";
}
它给出了一个错误,说'name'已在最后一行声明,但是如果我为'name = "some string"
更改它,则表示未声明变量名称。
答案 0 :(得分:5)
C#中的作用域规则与C不同 - 如果在外部作用域中声明变量名称,则在内部作用域之后声明它是无关紧要的。
您在string name
语句之外声明了if
变量的事实意味着它在if/else
的块中可用。
编译器抱怨,因为您在if/else
中声明了具有相同名称的其他变量。
如果从最后一行中删除类型,则变量仅在if/else
的内部范围内声明,但在它们之外是未知的,因此“未声明变量名称”错误。
以下编译就好了:
static void Main(string[] args)
{
string name = "world";
if (true)
{
name = "test";
}
else
{
name = "hello";
}
}
这里,变量在外部作用域中声明,因此在内部作用域中可见。你没有在内部范围内重新声明它,所以没有错误。
这是否是你想要的并不清楚你的问题。
答案 1 :(得分:3)
您需要在IF之前声明name变量。
static void Main(string[] args)
{
string name;
if (true)
{
name = "test";
}
else
{
name = "hello";
}
//name = "world";
}
最后一条语句已被注释掉,因为它会放弃您对name
语句中变量if
所做的任何更改。
答案 2 :(得分:2)
这是正确的。变量阻止同名变量(称为declaration space
)的代码部分与可访问变量的区域(scope
)不同。
特别是声明空间包含声明变量的整个块。因此,外部块中的name
会阻止此块中的任何其他name
变量或嵌套块。即在您的示例中,内部name
和外部name
的声明空间重叠导致编译器错误,因为任何标识符在其声明空间内必须是唯一的。内部和外部name
的范围不重叠。并且您不能在其范围之外使用变量。
这是根据规范设计和更正的。
查看Eric Lippert关于declaration space
和scope
之间差异的博客:
http://blogs.msdn.com/b/ericlippert/archive/2009/08/03/what-s-the-difference-part-two-scope-vs-declaration-space-vs-lifetime.aspx
命名实体的范围是程序文本的区域,通过其不合格的名称引用该实体是合法的。
相反,声明空间是程序文本的一个区域,其中不允许两个实体具有相同的名称 简而言之,范围回答了“我在哪里可以使用此名称?”的问题。和声明空间回答问题“这个名称在哪里独特?”