unsafe_variance
不安全的型別:在非共變位置中有型別變數。
此規則目前為實驗性,尚未在穩定的 SDK 中提供。
詳細資訊
#請勿宣告非共變成員。
實例變數的型別在其非共變位置中包含封閉類別、混入或列舉的型別參數,可能會因為型別檢查失敗而導致執行階段錯誤。例如,在 class C<X> {...}
中,形式為 void Function(X) myVariable;
的實例變數可能會導致此類執行階段失敗。
對於傳回型別在封閉宣告中具有型別參數的非共變發生的 getter 或方法也是如此。
此 lint 會標記此類成員宣告。
錯誤範例
dart
class C<X> {
final bool Function(X) fun; // LINT
C(this.fun);
}
void main() {
C<num> c = C<int>((i) => i.isEven);
c.fun(10); // Throws.
}
問題在於 X
在 fun
的型別中以參數型別出現。更好的方法是確保非共變成員 fun
*僅*在 this
上使用。我們無法嚴格執行此操作,但我們可以將其設為私有並新增轉發方法 fun
較佳範例
dart
class C<X> {
// ignore: unsafe_variance
final bool Function(X) _fun;
bool fun(X x) => _fun(x);
C(this.fun);
}
void main() {
C<num> c = C<int>((i) => i.isEven);
c.fun(10); // Succeeds.
}
完全安全的方法需要 Dart 尚未擁有的功能,即靜態檢查的變異數。有了它,我們就可以指定型別參數 X
是不變的 (inout X
)。
另一種可能性是宣告變數具有安全但更一般的型別。這樣使用變數本身是安全的,但每次調用都必須在執行階段進行檢查
正確範例
dart
class C<X> {
final bool Function(Never) fun;
C(this.fun);
}
void main() {
C<num> c = C<int>((i) => i.isEven);
var cfun = c.fun; // Local variable, enables promotion.
if (cfun is bool Function(int)) cfun(10); // Succeeds.
if (cfun is bool Function(bool)) cfun(true); // Not called.
}
用法
#若要啟用 unsafe_variance
規則,請在您的 analysis_options.yaml
檔案中的 linter > rules 下新增 unsafe_variance
analysis_options.yaml
yaml
linter:
rules:
- unsafe_variance
除非另有說明,否則本網站上的文件反映的是 Dart 3.6.0。頁面上次更新時間為 2024-07-03。 檢視來源 或 回報問題。