unsafe_variance
不安全的类型:在非协变位置具有类型变量。
此规则目前是实验性的,尚未在稳定的 SDK 中提供。
详情
#不要声明非协变的成员。
一个实例变量的类型在非协变位置包含封闭类、mixin 或枚举的类型参数,这很可能因类型检查失败而导致运行时故障。例如,在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。 查看源代码 或 报告问题。