CS0103和CS0136具有模式匹配

时间:2018-03-13 13:55:48

标签: c# scope c#-7.0

我有点困惑。为什么从一边我变成CS0103(变量不存在)和另一边CS0136(用自己的话 - 变量已经存在)和交换机中具有相同名称的变量声明?

有效

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

    case object str:
        break;
}

这里我成为编译错误 CS0103 “当前上下文中不存在名称”:

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

1 个答案:

答案 0 :(得分:5)

这里有三条规则:

  • 局部变量的范围通常是声明它的整个块。通过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 = "";
}