C# 使用';时已定义局部变量;是';关键字-不符合语言引用

C# 使用';时已定义局部变量;是';关键字-不符合语言引用,c#,C#,根据C#语言参考 如果expr为true且is与If语句一起使用,则varname将被分配,并且仅在If语句中具有局部范围 上述操作会产生以下错误: 此范围中已定义名为“folder”的局部变量或函数 为什么我不能重用变量名,因为它应该是每个if语句的局部变量名 您必须理解If不是范围限制语法 表示If语句的任何外部可用 它将限制在If循环内声明的变量的范围,而不是在If条件中声明它自己 根据: 让我们从范围开始,详细研究这两个规则。这个 变量c仅在第一个if的else分支的作用域中 陈述变量s

根据C#语言参考

如果expr为
true
is
If
语句一起使用,则varname将被分配,并且仅在
If
语句中具有局部范围

上述操作会产生以下错误:

此范围中已定义名为“folder”的局部变量或函数

为什么我不能重用变量名,因为它应该是每个
if
语句的局部变量名

  • 您必须理解If不是范围限制语法
  • 表示If语句的任何外部可用
  • 它将限制在If循环内声明的变量的范围,而不是在If条件中声明它自己
  • 根据:

    让我们从范围开始,详细研究这两个规则。这个 变量c仅在第一个if的else分支的作用域中 陈述变量s在方法的作用域中 电子计算机。这是因为if语句的每个分支 为变量建立单独的作用域。但是,if语句 事实并非如此这意味着if语句中声明的变量是 与if语句(本例中的方法)在同一范围内。此 行为不是特定于模式匹配的,而是定义的 变量作用域以及if和else语句的行为


    这是否奇怪且令人困惑(如果
    没有设置范围,而
    else
    设置范围)?是的,是的

    给定的
    文件夹可以在第一个
    之后分配
    ,如果
    ,那么它显然具有功能级别的作用域。@mjwills,但这肯定不是预期的行为。为什么会有人重复使用这样一个变量?例如,对于
    循环,您不能重复使用
    中定义的变量。根据我下面的回答,它是有文档记录的,并且是有意使用的。是的,令人困惑。:)为什么循环的工作方式不一样?因为它们创建了一个新的作用域(如果..is
    没有),那么,@S.McPharlin为什么会有人重复使用这样的变量?例如:
    if(!(obj是某物)){throw new Exception();}/*这里您可以使用某物*/
    。我最初将其标记为重复。经过进一步的思考,我认为复制的问题与这里讨论的不同。在这方面获得一些ECMA规范会很好,但遗憾的是,它们还不能用于7.0。不管怎么说,你在宣传栏上击败了我,向上投票
    expr is type varname 
    
    if(first_object is Folder folder)
    {
        // ...
    }
    
    if(second_object is Folder folder) // ERROR!
    {
        // ...
    }
    
    public static double ComputeAreaModernIs(object shape)
    {
        if (shape is Square s)
            return s.Side * s.Side;
        else if (shape is Circle c)
            return c.Radius * c.Radius * Math.PI;
        else if (shape is Rectangle r)
            return r.Height * r.Length;
        // elided
        throw new ArgumentException(
            message: "shape is not a recognized shape",
            paramName: nameof(shape));
    }