跳到主内容

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,则该变量将没有值

dart
void f(Object? x) {
  switch (x) {
    case int a when a > 0:
    case 0:
      a;
  }
}

以下代码会产生此诊断,因为变量 a 未在 default 子句中声明,并且如果主体被执行(因为没有其他子句匹配 x),则该变量将没有值

dart
void f(Object? x) {
  switch (x) {
    case int a when a > 0:
    default:
      a;
  }
}

以下代码会产生此诊断,因为如果主体被执行(因为另一组 case 导致控制流在标签处继续),则变量 a 将没有值

dart
void f(Object? x) {
  switch (x) {
    someLabel:
    case int a when a > 0:
      a;
    case int b when b < 0:
      continue someLabel;
  }
}

以下代码会产生此诊断,因为变量 a 虽然在所有 case 子句中都被赋值,但在每个子句中关联的类型却不相同

dart
void f(Object? x) {
  switch (x) {
    case int a when a < 0:
    case num a when a > 0:
      a;
  }
}

以下代码会产生此诊断,因为变量 a 在第一个 case 子句中是 final,而在第二个 case 子句中不是 final

dart
void f(Object? x) {
  switch (x) {
    case final int a when a < 0:
    case int a when a > 0:
      a;
  }
}

常见修复方法

#

如果该变量未在所有 case 中声明,并且您需要在语句中引用它,请在其他 case 中声明它

dart
void f(Object? x) {
  switch (x) {
    case int a when a > 0:
    case int a when a == 0:
      a;
  }
}

如果该变量未在所有 case 中声明,并且您不需要在语句中引用它,请移除对它的引用并从其他 case 中移除声明

dart
void f(int x) {
  switch (x) {
    case > 0:
    case 0:
  }
}

如果变量的类型不同,请确定变量应具有的类型并使 case 保持一致

dart
void f(Object? x) {
  switch (x) {
    case num a when a < 0:
    case num a when a > 0:
      a;
  }
}

如果变量的终结性不同,请确定它应该是 final 还是非 final,并使 case 保持一致

dart
void f(Object? x) {
  switch (x) {
    case final int a when a < 0:
    case final int a when a > 0:
      a;
  }
}