为什么在传递Foo
的实例而不是将D2
设置为d1
时会在{{1}}中中断?在.NET中,建议使用null
而不是as
,因为is
通常需要 two 强制转换/转换,这比is
测试更昂贵。
null
答案 0 :(得分:3)
因为如果对象不是右侧类型(或as
)的实例,则Dart中的null
运算符将引发。 不与C#中的as
运算符相似,后者的计算结果为null
而不是抛出。
您的代码以var d1 = d1OrD2 as D1;
开头,当d1OrD2
是D2
实例时,该操作将抛出。
您应该做的是:
void Foo(Base d1OrD2) {
if (d1OrD2 is D1) {
// Static type of d1OrD2 is D1 here, you can call D1 methods on it.
print("it's d1");
} else {
var d2 = d1OrD2 as D2;
print("it's d2");
}
}