[英]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! is
: null安全
这就像如果myNum
是null
抛出error
并且不检查。 如果myNum
not null
,则按is
工作。
结论:
这些似乎都适用于相反的情况:if(picture !is XFile) & if(picture is!XFile)
他们应该为相反的工作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.