C#中的Case语句块级声明空间难道我错过了case语句中的块不被认为是块级声明空间的原因吗?当我尝试casex:varsomeVariable=42;时,我不断收到错误(变量已声明)休息;情况y:varsomeVariable=40;休息;但我可以做casex:try{varsomeVariable=42;}catch{}break;案例y:try{varsomeVariable=40;}catch{}break;如果C#允许传递语句是没有意义的,但它不允许,我想不出一种方法可以在case语句中声明一个变量并在该块外部使用它。更新:这个问题被用作这篇博文的灵感;查看更多详细信息。http://ericlippert.com/2009/08/13/four-switch-oddities/感谢您提出有趣的问题。其他各种答案中有很多混淆和错误陈述,没有一个能真正解释为什么这是非法的。我会尽力确定。首先,严格来说,“范围”是描述问题的错误词。巧合的是,我上周写了一篇关于滥用“范围”的博文;这将在我的迭代器块系列之后进行,该系列将贯穿整个7月。正确使用的术语是“声明空间”。声明空间是一个代码区域,两个不同的东西不能用相同的名字声明。此处描述的场景是switch部分未定义声明空间这一事实的症状,尽管switch块定义了声明空间。由于OP的两个声明属于同一个声明空间,同名,所以是非法的。(是的,switch块也定义了一个范围,但这个事实与问题无关,因为问题是关于声明的合法性,而不是标识符查找的语义。)一个合理的问题是“为什么这不合法?”A合乎逻辑的答案是“好吧,为什么会这样”?您可以通过以下两种方式之一进行操作。这是合法的:switch(y){case1:intx=123;...休息;情况2:intx=456;...休息;}或者这是合法的:switch(y){case1:intx=123;...休息;情况2:x=456;...休息;但是你不能两种方式都做。C#的设计者选择了第二种方式,这种方式看起来更自然。这个决定是在1999年7月7日做出的,差不多十年前了。当天的笔记中的评论非常简短,只是简单地说明“switchcase不创建自己的声明空间”,然后提供一些示例代码说明哪些有效,哪些无效。为了在这个特殊的日子里更多地了解设计师的想法,我不得不让很多人对他们十年前的想法感到不安——并且告诉他们什么是最终微不足道的;我不会那样做。简而言之,没有特别令人信服的理由来选择一种方式;两者都有优点。语言设计团队选择了一种方式,因为他们不得不这样做;他们选择的那个对我来说似乎是合理的。啊-你没有摔倒,但你可以使用goto跳转到另一个标记的案例块。因此,块必须在同一范围内。你也可以这样做:casex:{varsomeVariable=42;}break;情况y:{varsomeVariable=40;}休息;本质上,大括号创建了词法作用域,因此如果没有大括号,someVariable将被加载到符号表中两次。我认为这个选择可能只是为了避免混淆,并可能避免增加符号表构造的复杂性。因为case不是块,所以没有花括号来指示范围。没有更好的词了,标签。您最好在switch()语句之外声明变量,然后再使用它。当然,在这种情况下您将无法使用var关键字,因为编译器不知道要初始化什么类型。您可以在switch语句的范围之外声明变量。以上就是《C#学习教程:C#中case语句块级声明空间》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——varsomeVariable;转变();情况x:someVariable=42;休息;情况y:someVariable=40;休息;本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
