目錄

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.
}

問題在於 Xfun 的型別中以參數型別出現。更好的方法是確保非共變成員 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