無効なパターン変数、共有caseスコープ
変数「{0}」は、このボディを共有するすべてのcaseで、同じ型および/またはfinalityを持っていません。
変数「{0}」は、このボディを共有する一部のcaseで利用可能ですが、すべてではありません。
変数「{0}」は、ラベルまたは「default」caseがあるため利用できません。
説明
#switch文で複数のcase節がボディを共有しており、それらのうち少なくとも1つが共有ステートメントで参照される変数を宣言しているが、その変数がすべてのcase節で宣言されていないか、または一貫性のない方法で宣言されている場合に、アナライザはこの診断を生成します。
変数がすべてのcase節で宣言されていない場合、変数を宣言しないcase節の1つが一致してボディを実行すると、その変数は値を持たなくなります。これには、case節の1つがdefault節である状況も含まれます。
変数が一貫性のない方法で宣言されている場合、つまり一部のcaseでfinalであり、他のcaseではそうでない場合、または異なるcaseで異なる型を持つ場合、変数の型またはfinalityが何であるべきかのセマンティクスは定義されていません。
例
#以下のコードは、変数aが1つのcase節でのみ宣言されており、2番目の節が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;
}
}以下のコードは、変数aが、異なるcaseのグループがラベルへの制御を継続させたために、ボディが実行された場合に値を持たないため、この診断を生成します。
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であり、2番目の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;
}
}変数のfinalityが異なる場合は、finalにするかfinalにしないかを決定し、caseを一致させてください。
void f(Object? x) {
switch (x) {
case final int a when a < 0:
case final int a when a > 0:
a;
}
}