此问题在此处已有答案:
Smart cast (automatic type promotion) using 'is' is not working(2个答案)
27天前关闭。
在检查Dart中对象的属性是否属于特定的子类型之后,Dart似乎无法推断/知道/记住属性todo
在代码中的子类型。
例如,如果我检查state.todo
是Todo_hasChildren
类型,然后使用state.todo
作为Todo_hasChildren
类型,我会得到一个Dart分析错误(“参数类型'Todo 3'不能分配给参数类型'Todo3_hasChildren'”)。
我知道如何解决这个问题(使用as
关键字进行转换或将属性分配给自己的变量),但为什么它不知道类型?这是Dart演变中的临时性还是永久性的?
class MyState {
final Todo todo;
MyState(this.todo);
}
void doStuff(MyState state) {
if (state.todo is Todo_hasChildren) //
processHasChild(state.todo);
}
void processHasChild(Todo_hasChildren todo) {}
字符串
2条答案
按热度按时间jgovgodb1#
原因实际上是
MyState
类的子类可能会用getter覆盖该字段,而getter并不总是给予相同的值。如下所示:字符串
现在,当使用
MyState2
调用doStuff
时,类型检查可能会在第一次通过,但当为processHasChild
获取类型检查时,它可能会返回错误的类型。你可以尝试这个完整的程序,看看自己,它偶尔崩溃,因为这一点:
型
avwztpqn2#
因为
todo
是state
的一个属性,Dart只能在从局部变量提升类型时才能推断出类型。这与可空类型提升非常相似。参见:使用可空字段。所以你必须这样做:
字符串