代码之家  ›  专栏  ›  技术社区  ›  kemiller2002

C中的Case语句块级声明空间#

  •  7
  • kemiller2002  · 技术社区  · 16 年前

    case语句中的块不被视为块级声明空间,这有什么原因吗?

    当我尝试时,我不断地得到一个错误(变量已经声明)

    case x:
      var someVariable = 42;
    break;
    case y: 
       var someVariable = 40;
    break;
    

    但我能做到

    case x:
       try{var someVariable = 42;}catch{} 
    break;
    case y: 
        try{var someVariable = 40;}catch{}
    break;
    

    如果C#允许使用fall-through语句,这是有意义的,但事实并非如此,我想不出一个场景,在case语句中声明一个变量并在该块之外使用它。

    5 回复  |  直到 9 年前
        1
  •  38
  •   Eric Lippert    11 年前

    更新:这个问题被用作这篇博文的灵感来源;有关更多详细信息,请参阅。

    http://ericlippert.com/2009/08/13/four-switch-oddities/


    在其他各种答案中有许多混淆和错误陈述,但没有一个能真正解释为什么这是非法的。我将试图确定。

    正确使用的术语是“ 声明空间 一种代码区域,其中不能声明两个不同的事物具有相同的名称 部分 由于OP的两个声明位于同一个声明空间中并且具有相同的名称,因此它们是非法的。

    (是的,开关块 而且 定义了一个范围,但该事实与问题无关,因为问题是关于 声明的合法性 标识符查找的语义 .)

    一个合理的问题是“为什么这是不合法的?”一个合理的答案是“那么,为什么它应该是”?你可以用两种方法中的一种。这是合法的:

    switch(y)
    {
    case 1:  int x = 123; ... break;
    case 2:  int x = 456; ... break;
    }
    

    或者这是合法的:

    switch(y)
    {
    case 1:  int x = 123; ... break;
    case 2:  x = 456; ... break;
    }
    

    二者都 方式。C#的设计者选择了第二种方式,因为这似乎是更自然的方式。

    开关案例不会创建自己的声明空间

    为了进一步了解设计师们在这一天的想法,我必须让很多人了解他们十年前的想法——并让他们了解最终是一个微不足道的问题;我不会那么做的。

    尤其 选择一种或另一种方式的令人信服的理由;两者都有优点。语言设计团队选择了一种方式,因为他们必须选择一种;他们选的那个对我来说很合理。

        2
  •  8
  •   NeedHack    16 年前

        3
  •  4
  •   Timothy Carter    16 年前

    你也可以这样做:

    case x:
      {var someVariable = 42;}
    break;
    case y: 
       {var someVariable = 40;}
    break;
    

        4
  •  2
  •   John Rudy    16 年前

    因为案例不是块,所以没有表示范围的大括号。由于缺少更好的词,案例就像标签一样。

    switch() var 关键字,因为编译器不知道要初始化的类型。

        5
  •  1
  •   Dystar    4 年前

    从C#8.0开始,您现在可以使用 switch expressions

    使用开关表达式根据与输入表达式的模式匹配,从候选表达式列表中计算单个表达式

    var someVariable = caseSwitch switch {
        case x => 42,
        case y => 40,
        _ => throw new Exception("This is how to declare default")
    };
    
        6
  •  -1
  •   Nate    16 年前

    您可以在switch语句的范围之外声明变量。

    var someVariable;
    
    switch();
    case x:   
    someVariable = 42;
    break; 
    case y:     
    someVariable = 40;
    break;
    
    推荐文章