繁体   English   中英

is 之间有什么区别? 并且 ! 在 Dart 中?

[英]What's the difference between is! and !is in Dart?

我想看看一个变量是否不是某种类型。 我知道我可以做if(picture is XFile) ,但这些似乎都适用于相反的情况:

if(picture !is XFile)

if(picture is! XFile)

有什么不同?

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

也许你的意思是比较x is! T x is! T!(x is T) 这些表达式之间没有逻辑差异。 一个 linter 规则表明它is! should be preferred ,但它没有提供任何解释原因。 我相信这是因为is! 表面上读起来更好(“不是”)并且比否定括号表达式更简单。 (然而,这种立场早于 null-safety,并且可以说is!现在可能更令人困惑,因为存在后缀!运算符。)

void main() {
  var myNum = 5;

  if (myNum is! int) {
    print('myNum is an integer');
  }else{
    print('not an integer');
  }
}

output: not an integer ,它与is !int相同

void main() {
  var myNum = null;

  if (myNum is int) {
    print('myNum is an integer');
  }else{
    print('not an integer');
  }
}

output: not an integer因为值是null所以不是int makes sens

void main() {
  var myNum = null;

  if (myNum !is int) {
    print('myNum is an integer');
  }else{
    print('not an integer');
  }
}

output: Uncaught TypeError: Cannot read properties of null (reading 'toString')Error: TypeError: Cannot read properties of null (reading 'toString')对于编译器它与myNum! is myNum! isnull安全

这就像如果myNumnull抛出error并且不检查。 如果myNum not null ,则按is工作。

结论

这些似乎都适用于相反的情况:if(picture !is XFile) & if(picture is!XFile)

他们应该为相反的工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM