具有模式匹配的 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 = "";
CS0103: The name 'identifier' does not exist in the current context
这里有三个规则:
- 局部变量的范围通常是声明它的整个块。通过 switch 语句中的模式匹配引入的变量比它稍微窄一些,这就是你如何能够同时拥有
object str
和 string 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 = "";
}
我有点困惑。为什么从一方面我变成 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 = "";
CS0103: The name 'identifier' does not exist in the current context
这里有三个规则:
- 局部变量的范围通常是声明它的整个块。通过 switch 语句中的模式匹配引入的变量比它稍微窄一些,这就是你如何能够同时拥有
object str
和string 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 = "";
}