首页 > 解决方案 > 使用“is”关键字时已定义局部变量 - 与语言参考不符

问题描述

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

expr is type varname 

如果 exprtrue与语句is一起使用if,则分配 varname 并且仅在语句内具有局部范围if

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

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

以上产生以下错误:

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

为什么我不能重用变量名,因为它应该只对每个if语句都是本地的?

标签: c#

解决方案


根据文档

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确实如此)?是的,是的。:)


推荐阅读