2017-04-30 41 views
2

飛鏢語言1.22.0 changelog狀態:爲什麼在DART語言中test(null是Type)的計算結果爲false?

null類型已被移動到類型層次結構的底部。如 這樣,它被認爲是每個其他類型的子類型。空文字 總是被視爲底部類型。

如果Null是bottom-type,null是Null類的唯一實例,爲什麼測試(null is B)下面的計算結果爲false?

class A {} 
class B extends A{} 

void main() { 
    B b = new B(); 
    print(b is B); // true 
    print(b is A); // b is A because B is subtype of A 
    print(null is B); // false 
} 

回答

3

因爲is測試是這樣定義的。對於類類型,它執行子類檢查,而不是子類型檢查。

它這樣做是因爲它不太可能執行is檢查,但仍不知道是否可以安全地調用對象的方法。這意味着你將永遠需要做if (x is Foo && x != null) x.fooMethod();。因此,該元素具有檢查種類和不null(除非null是類型的子類)is檢查檢查

什麼是怎麼回事的是,在飛鏢的類型是(目前)都被認爲可空。也就是說,當您編寫int x;時,您聲明一個變量可能包含intnull。在你編寫類型的大多數地方,它被隱含地認爲是該類型的可爲空版本(該類型或Null)。 is測試是一個例外,其中類型僅被視爲自己。

如果Dart在將來的某個時間點獲得不可空的類型,則必須編寫類似int?的可空類型,並使用int來獲得不可空的版本。此時,您可以在可空類型的is測試測試的類型上添加?,或者不要更改並保留對不可空類型的測試。

相關問題