invalid_pattern_variable_in_shared_case_scope
变量 '{0}' 在所有共享此主体的 case 中没有相同的类型和/或终结性。
变量 '{0}' 在共享此主体的一部分(但不是所有)case 中可用。
变量 '{0}' 不可用,因为存在标签或 'default' case。
描述
#当 switch 语句中的多个 case 子句共享一个主体,并且其中至少一个声明了在共享语句中引用的变量,但该变量未在所有 case 子句中声明或以不一致的方式声明时,分析器会生成此诊断。
如果该变量未在所有 case 子句中声明,那么如果匹配并执行主体的 case 子句之一是未声明该变量的子句,则该变量将没有值。这包括其中一个 case 子句是 default
子句的情况。
如果变量以不一致的方式声明,例如在某些 case 中是 final
而在其他 case 中不是 final
,或者在不同 case 中具有不同的类型,那么该变量的类型或终结性的语义是未定义的。
示例
#以下代码会产生此诊断,因为变量 a
仅在一个 case 子句中声明,如果第二个子句匹配了 x
,则该变量将没有值
void f(Object? x) {
switch (x) {
case int a when a > 0:
case 0:
a;
}
}
以下代码会产生此诊断,因为变量 a
未在 default
子句中声明,并且如果主体被执行(因为没有其他子句匹配 x
),则该变量将没有值
void f(Object? x) {
switch (x) {
case int a when a > 0:
default:
a;
}
}
以下代码会产生此诊断,因为如果主体被执行(因为另一组 case 导致控制流在标签处继续),则变量 a
将没有值
void f(Object? x) {
switch (x) {
someLabel:
case int a when a > 0:
a;
case int b when b < 0:
continue someLabel;
}
}
以下代码会产生此诊断,因为变量 a
虽然在所有 case 子句中都被赋值,但在每个子句中关联的类型却不相同
void f(Object? x) {
switch (x) {
case int a when a < 0:
case num a when a > 0:
a;
}
}
以下代码会产生此诊断,因为变量 a
在第一个 case 子句中是 final
,而在第二个 case 子句中不是 final
void f(Object? x) {
switch (x) {
case final int a when a < 0:
case int a when a > 0:
a;
}
}
常见修复方法
#如果该变量未在所有 case 中声明,并且您需要在语句中引用它,请在其他 case 中声明它
void f(Object? x) {
switch (x) {
case int a when a > 0:
case int a when a == 0:
a;
}
}
如果该变量未在所有 case 中声明,并且您不需要在语句中引用它,请移除对它的引用并从其他 case 中移除声明
void f(int x) {
switch (x) {
case > 0:
case 0:
}
}
如果变量的类型不同,请确定变量应具有的类型并使 case 保持一致
void f(Object? x) {
switch (x) {
case num a when a < 0:
case num a when a > 0:
a;
}
}
如果变量的终结性不同,请确定它应该是 final
还是非 final
,并使 case 保持一致
void f(Object? x) {
switch (x) {
case final int a when a < 0:
case final int a when a > 0:
a;
}
}