使用'is'关键字时已经定义的局部变量-与语言参考背道而驰

时间:2018-11-05 05:21:25

标签: c#

根据https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/is#pattern-matching-with-is上的C#语言参考

expr is type varname 
  

如果expr为true,并且isif语句一起使用,则varname被分配并且仅在if语句中具有本地作用域 >。

if(first_object is Folder folder)
{
    // ...
}

if(second_object is Folder folder) // ERROR!
{
    // ...
}

以上内容会产生以下错误:

  

已在此范围内定义了名为“文件夹”的局部变量或函数

为什么只在每个if语句中使用变量名,为什么不能重用它呢?

2 个答案:

答案 0 :(得分:1)

根据the docs

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));
}
  

让我们从范围开始详细研究这两个规则。的   变量c仅在第一个if的else分支中在范围内   声明。变量s在方法的范围内   ComputeAreaModernIs。那是因为if语句的每个分支   建立变量的单独作用域。但是,if语句   本身没有。 这意味着在if语句中声明的变量为   与if语句(在本例中为方法)的作用域相同。   行为并非特定于模式匹配,而是已定义   范围和if和else语句的行为。

这很奇怪并且令人困惑(if未设置作用域,而else却设置了作用域)吗?是的,是的。 :)

答案 1 :(得分:0)

  1. 您必须了解If不是范围限制语法。
  2. 表示If语句外的所有内容。
  3. 它将限制在If循环内声明的变量的范围,而不是在If Condition内声明的变量的范围。