有什么区别呢!并且 ! 在 Dart 中?

Dan*_*ssa 0 dart

我想看看一个变量是否不属于某种类型。我知道我可以做到if(picture is XFile),但这两者似乎都起到相反的作用:

if(picture !is XFile)

if(picture is! XFile)

有什么不同?

jam*_*lin 5

x !is T不是你想的那样。如果你运行dart format你的代码,你会发现它实际上是x! is T;也就是说,它使用后修复 !运算符,该运算符断言xis not null,然后执行正常is T检查(因此产生与您预期相反的结果)。如果x静态已知不可为空,dart analyze则应生成有关不必要地使用空断言运算符的警告。

也许您的意思是比较x is! T!(x is T)。这些表达式之间没有逻辑差异。有一个 linter 规则建议is!应该首选,但它没有提供任何解释原因。我相信这是因为is!表面上读起来更好(“不是”)并且比否定括号表达式更简单。(然而,这种立场早于空安全,并且is!现在可能会因为后修复!运算符的存在而更加令人困惑。)