为什么“ is”运算符的if范围比if更长?

热情的开发者

所以我的问题是:

为什么(以及如何避免这种情况)C#中的Is-operator的寿命比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-condition中声明了变量c,所以它将范围限定于if-condition,这是不正确的。

编辑:我理解方括号参数(范围以括号开头,以其结尾)。

为什么for循环那么不同呢?

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

Console.WriteLine(i) // error
哈桑·埃姆拉·桑古(Hasan EmrahSüngü)

您所期望的可能并不总是始终符合语言规范。我认为您可能已经知道了名称,但是您正在使用的名称称为Pattern Matching这是从MSDN提取模式匹配范围的规则(我正在复制粘贴相关部分:

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

简单地说你的范围将开始{和结束与}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么排他运算符没有包含范围运算符会引发错误?

来自分类Dev

为什么是$!运算符右关联?

来自分类Dev

为什么需要运算符重载?

来自分类Dev

为什么是$!运算符右关联?

来自分类Dev

STL-为什么将范围解析运算符用于迭代器

来自分类Dev

为什么我们将 ::(范围解析运算符)放在迭代器之前?

来自分类Dev

..范围选择运算符背后的逻辑是什么?

来自分类Dev

什么是@”运算符?

来自分类Dev

什么是@运算符?

来自分类Dev

什么是“ >> =”运算符?

来自分类Dev

什么是()=>运算符?

来自分类Dev

什么是“ =>”运算符?

来自分类Dev

什么是“ $”运算符?

来自分类Dev

什么是()=>运算符?

来自分类Dev

什么是“ =>”运算符?

来自分类Dev

为什么我的“ +”运算符被视为换行符?

来自分类Dev

为什么我的“ +”运算符被视为换行符?

来自分类Dev

为什么使用范围解析运算符更改全局命名空间中哪个重载模板被调用?

来自分类Dev

在非“ * this”的对象上使用基于范围的for循环时,为什么会出现“运算符*不匹配”的问题?

来自分类Dev

为什么在构造函数初始化期间不能使用范围解析运算符?

来自分类Dev

在C ++ 20中使用范围时,为什么管道运算符不起作用?

来自分类Dev

为什么我的自定义迭代器需要基于范围的for循环中的调用运算符?

来自分类Dev

我不明白为什么范围函数增量参数适用于切片运算符

来自分类Dev

为什么按位运算符没有逻辑“和/或”运算符那么聪明

来自分类Dev

为什么“ as”运算符在C#中不使用隐式转换运算符?

来自分类Dev

OCaml:为什么比较运算符是类型无关的,而算术运算符不是?

来自分类Dev

Python 2:为什么楼层除法运算符比普通除法运算符快?

来自分类Dev

为什么map.find使用<运算符而不是==运算符?

来自分类Dev

为什么运算符过载而不是运算符覆盖?

Related 相关文章

  1. 1

    为什么排他运算符没有包含范围运算符会引发错误?

  2. 2

    为什么是$!运算符右关联?

  3. 3

    为什么需要运算符重载?

  4. 4

    为什么是$!运算符右关联?

  5. 5

    STL-为什么将范围解析运算符用于迭代器

  6. 6

    为什么我们将 ::(范围解析运算符)放在迭代器之前?

  7. 7

    ..范围选择运算符背后的逻辑是什么?

  8. 8

    什么是@”运算符?

  9. 9

    什么是@运算符?

  10. 10

    什么是“ >> =”运算符?

  11. 11

    什么是()=>运算符?

  12. 12

    什么是“ =>”运算符?

  13. 13

    什么是“ $”运算符?

  14. 14

    什么是()=>运算符?

  15. 15

    什么是“ =>”运算符?

  16. 16

    为什么我的“ +”运算符被视为换行符?

  17. 17

    为什么我的“ +”运算符被视为换行符?

  18. 18

    为什么使用范围解析运算符更改全局命名空间中哪个重载模板被调用?

  19. 19

    在非“ * this”的对象上使用基于范围的for循环时,为什么会出现“运算符*不匹配”的问题?

  20. 20

    为什么在构造函数初始化期间不能使用范围解析运算符?

  21. 21

    在C ++ 20中使用范围时,为什么管道运算符不起作用?

  22. 22

    为什么我的自定义迭代器需要基于范围的for循环中的调用运算符?

  23. 23

    我不明白为什么范围函数增量参数适用于切片运算符

  24. 24

    为什么按位运算符没有逻辑“和/或”运算符那么聪明

  25. 25

    为什么“ as”运算符在C#中不使用隐式转换运算符?

  26. 26

    OCaml:为什么比较运算符是类型无关的,而算术运算符不是?

  27. 27

    Python 2:为什么楼层除法运算符比普通除法运算符快?

  28. 28

    为什么map.find使用<运算符而不是==运算符?

  29. 29

    为什么运算符过载而不是运算符覆盖?

热门标签

归档