使用 is 运算符的变量初始化在使用相同的变量名时会出错
Variable initialization using is operator gives error when using same variable name
我在使用 is
运算符检查类型时使用 C# 7.0 语法初始化变量。我想对所有场景使用相同的变量名,比如 "animal",如下所示:
// Yes, polymorphism may be better. This is just an illustration.
if (item is Dog animal) { // ... }
else if (item is Cat animal) { // ... }
else if (item is Animal animal) { // ... }
else { // ... }
但是,我收到一条错误消息,指出变量名称用于封闭范围。有办法解决这个问题吗?我真的不想为每个 else if
语句使用不同的变量名。
This page 对正在发生的事情有很好的解释。基本上,正如错误指示的那样,初始化变量在 if
和 else if
语句的封闭范围内可用。这类似于 out
参数的工作方式。所以,是的,当使用一系列 if
语句时,您只能使用一个变量名一次。
另一种方法是使用 switch
而不是 if
:
switch (item) {
case Dog animal:
// ...
break;
case Cat animal:
// ...
break;
case Animal animal:
// ...
break;
default:
// Interestingly, you cannot reuse the variable name here.
// But you could create a new scope and then reuse it.
{
Animal animal = ...
}
break;
}
在switch
中初始化的变量被限制在它们case
的范围内。 See also.
我在使用 is
运算符检查类型时使用 C# 7.0 语法初始化变量。我想对所有场景使用相同的变量名,比如 "animal",如下所示:
// Yes, polymorphism may be better. This is just an illustration.
if (item is Dog animal) { // ... }
else if (item is Cat animal) { // ... }
else if (item is Animal animal) { // ... }
else { // ... }
但是,我收到一条错误消息,指出变量名称用于封闭范围。有办法解决这个问题吗?我真的不想为每个 else if
语句使用不同的变量名。
This page 对正在发生的事情有很好的解释。基本上,正如错误指示的那样,初始化变量在 if
和 else if
语句的封闭范围内可用。这类似于 out
参数的工作方式。所以,是的,当使用一系列 if
语句时,您只能使用一个变量名一次。
另一种方法是使用 switch
而不是 if
:
switch (item) {
case Dog animal:
// ...
break;
case Cat animal:
// ...
break;
case Animal animal:
// ...
break;
default:
// Interestingly, you cannot reuse the variable name here.
// But you could create a new scope and then reuse it.
{
Animal animal = ...
}
break;
}
在switch
中初始化的变量被限制在它们case
的范围内。 See also.