具有模式匹配的 CS0103 和 CS0136

CS0103 and CS0136 with pattern matching

我有点困惑。为什么从一方面我变成 CS0103(变量不存在)而从另一方面变成 CS0136(用自己的话 - 变量已经存在)并且在 switch 中声明同名变量有效?

这个有效

var obj = new object();
switch (obj)
{
    case string str:
        break;

    case object str:
        break;
}

这里我变成编译错误CS0103"The name ' ' does not exist in the current context":

var obj = new object();
switch (obj)
{
    case string str: 
        break;
}
if (str == null) { } //CS0103

这里我变成编译错误CS0136:

var obj = new object();
switch (obj)
{
    case string str: //<--- CS0136
        break;
}
string str = "";

CS0136: A local variable named 'var' cannot be declared in this scope because it would give a different meaning to 'var', which is already used in a 'parent or current/child' scope to denote something else

CS0103: The name 'identifier' does not exist in the current context

这里有三个规则:

  • 局部变量的范围通常是声明它的整个块。通过 switch 语句中的模式匹配引入的变量比它稍微窄一些,这就是你如何能够同时拥有 object strstring str 的模式 - 但你不需要它来证明这些特定错误。
  • 您不能在其范围之外使用变量
  • 您不能在另一个同名的范围内声明一个局部变量。

您不需要模式匹配来证明这一点。这是给出 CS0103 错误的简单方法:

void Method()
{
    {
        // Scope of str is the nested block.
        string str = "";
    }
    // str isn't in scope here, so you can't refer to it;
    // second bullet point
    if (str == "") {}
}

下面是 CS0136 的示例:

void Method()
{
    {
        // Can't declare this variable, because the str variable
        // declared later is already in scope
        string str = "";
    }
    // Scope of this variable is the whole method
    string str = "";
}