【问题标题】:Why is the "is"-operator in an if a longer scope then the if?为什么“is”运算符在 if 的范围内比 if 更长?
【发布时间】:2020-11-08 17:37:38
【问题描述】:

所以我的问题是:

为什么(以及如何避免)C# 中的 Is 运算符的生命周期与 if 中使用的一样长?

例子:

Animal a = new Cat();
if (a is Cat c)
{
    Console.WriteLine(c); // Works
}

Console.WriteLine(c); // Works too

// Leads to an error because c is allready declared
if (a is Cat c)
{
    ....
}

我所期望的是,因为我在 if 条件中声明了变量 c,所以它将被限定为该 if 条件,这是不正确的。

编辑: 我理解括号参数(范围以括号开头并以它结尾)。 但是

为什么 for 循环那么不同?

for (int i = 0; i<3; i++)
{
....
}

Console.WriteLine(i) // error

【问题讨论】:

  • Console.WriteLine(c); // 也有效 真的吗???
  • @TaW 是的,在这个问题的上下文中(变量范围)
  • 不在这里。我无法复制。
  • Me neither... 编译错误(第 12 行,第 21 列):使用未分配的局部变量 'c'
  • Also well documented: "如果 expr 为真并且与 if 语句一起使用,则 varname 仅在 if 语句中分配。varname 的范围是从 is 表达式到结尾封闭 if 语句的块。在任何其他位置使用 varname 都会生成编译时错误,以使用尚未分配的变量。"

标签: c# c#-7.0


【解决方案1】:

您的期望可能并不总是符合语言规范。我想你可能已经知道名字了,但你使用的是Pattern Matching。 以下是取自 MSDN 的 Pattern Matching 范围的规则(我正在复制粘贴相关部分:

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 语句的定义行为。

简单地说,您的范围将以{ 开头并以} 结尾

【讨论】:

  • 但是在 for 循环中使用该参数,声明为 countin 变量的变量(例如 int i = 0)也应该在循环本身之后可用......对吗?
  • for 循环文档明确指出:“局部循环变量的声明和初始化,不能从循环外访问。”
  • 第四版 C# 中 for-loop 的行为发生了变化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2015-08-17
  • 1970-01-01
  • 2020-10-08
  • 2013-08-10
  • 1970-01-01
相关资源
最近更新 更多