首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >3-liner中错误CS0136出现的原因不明

问3-liner中错误CS0136出现的原因不明
EN

Stack Overflow用户
提问于 2020-05-13 15:48:07
回答 1查看 121关注 0票数 1

这段代码会产生错误CS0136:

代码语言:javascript
复制
static void Main(string[] args)
{
    foreach (var arg in args) Console.WriteLine(arg); // error in this line (arg is underlined red)
    string arg = "lol";
    Console.WriteLine(arg);
}

Error description according to microsoft:

不能在此作用域中声明名为“var”的局部变量,因为它将为“var”赋予不同的含义,后者已在“parent or current/child”作用域中用于表示其他内容。

在本例中,编译器声明foreach循环中的参数arg已经声明。我遇到的问题是,我在foreach循环之后声明了字符串arg,所以它应该可以工作,或者我错过了一些要点。是不是某种重新排列代码顺序的“优化”?

我明白,如果我在foreach循环之前声明它,那将是一个错误。此外,我知道我可以用不同的方式命名它。但我想要理解它。

EN

回答 1

Stack Overflow用户

发布于 2020-05-13 15:52:00

我遇到的问题是,我在foreach循环之后声明了字符串arg,所以它应该可以工作

不,不应该是这样。

局部变量的作用域是声明它的整个块--而不仅仅是从那一点开始。您不能在声明点之前使用它,但它仍然在作用域中。

从C# 5 ECMA Standard 8.7.1节中:

  • 在局部变量声明中声明的局部变量的作用域(§13.6.2)是在其中进行声明的块。

然后(仍在8.7.1中):

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

..。

注意:局部变量和局部常量的作用域规则旨在保证表达式上下文中使用的名称在块中的含义始终相同。如果局部变量的作用域仅从其声明扩展到块的末尾,则在上面的示例中,第一个赋值将赋值给实例变量,第二个赋值将赋值给局部变量,如果稍后重新排列块的语句,则可能导致编译时错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61769045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档