为什么它在突破Foo传球的实例时D2,而不是设置d1到null?在 .NET 中,建议使用as而不是is因为is通常需要两次转换/转换,这比null测试更昂贵。
class Base {}
class D1 extends Base{}
class D2 extends Base{}
void Foo(Base d1OrD2) {
var d1 = d1OrD2 as D1;
if (d1 != null) print("it's d1");
else {
var d2 = d1OrD2 as D2;
if (d2 != null) print("it's d2");
}
}
void main() async{
Foo(D2()); // throws exception D2 is not an instance of D1.
Foo(D1()); // works
}
Run Code Online (Sandbox Code Playgroud)
因为asDart 中的运算符在对象不是右侧类型(或null)的实例时抛出。这是不是类似as在C#运营商将计算得到null的,而不是抛出。
您的代码以var d1 = d1OrD2 as D1;Whend1OrD2是一个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");
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3750 次 |
| 最近记录: |