[英]Why are incorrect type assignments allowed in Dart?
我知道 Dart 的類型幾乎是可選的,但是如果我選擇指定變量類型,我希望像int i = "abc"
這樣的賦值會在運行時拋出錯誤。 但是,無論是以下內容還是以下任何內容都不會引發錯誤,它們只是忽略了類型轉換。
String str = "test";
int integer = 5;
double decimal = 1.5;
List list = [1,2,3];
String s = decimal; print(s); // 1.5
int i = str; print(i); // test
double d = list; print(d); // [1, 2, 3]
List l = integer; print(l); // 5
在我發現的本教程中,它說:
但是下面的代碼片段會產生一個錯誤,因為編譯器將 b 識別為一個被錯誤分配雙精度值的 int。 這是實際中的類型檢查,也是 Dart 在 JavaScript 上改進的眾多方式之一。
int b=7898765;
b = 9.8; // 錯誤不能給 int 賦值
但是,在使用 Dartium 或使用<script src="packages/browser/dart.js"></script>
時,該代碼不會為我生成錯誤。
如果我執行var i = "abc" + 1.5
,它會拋出一個錯誤,那么為什么類型錯誤分配不做同樣的事情呢? 這是疏忽還是設計選擇? 如果是后者,原因是什么?
提前致謝。
在 Dart 中,在生產模式(默認)下運行時,只會忽略類型注釋。 如果您在選中模式下運行,則類型被選中。 如果在實例上調用不存在的方法,仍會引發異常。
var i = "abc" + 1.5
+
運算符(方法)顯然對參數進行類型檢查並拋出,因為它不是非字符串值。
對於從 Dart 生成的 JS,您可以通過添加配置$dart2js
轉換器來生成“檢查模式”輸出
transformers:
- $dart2js:
checked: true
到您的pubspec.yaml
文件(有關更多$dart2js
選項,請參閱為 Pub 配置內置 dart2js 轉換器)。 這僅在您使用pub build
時才生效。 如果您直接使用dart2js
生成 JS,請傳遞-c
標志以創建檢查模式輸出。
對於在服務器 VM 上運行的代碼,還傳遞-c
標志,如
dart -c your_script.dart
在您的問題中,您沒有提供有關如何運行 Dart 腳本或如何生成 JS 的任何信息。
在這個簡單的DartPad 中,編輯器顯示來自靜態分析的錯誤,這是添加類型注釋的另一個用例。
Dart 2.6 拒絕此代碼。
A value of type 'double' can't be assigned to a variable of type 'String'
https://dartpad.dev/10ebe4bb74a11fe6e68efb351af40d1a
我還用Map<String, dynamic>
進行了測試(為了更好地理解JSON 反序列化模式)
void main() {
Map<String, dynamic> map = {
'str': 'test',
'integer': 5,
'decimal': 1.5,
'list': [1,2,3]
};
String s = map['decimal']; print(s); // JSDouble not String
int i = map['str']; print(i); // JSString not int
double d = map['list']; print(d); // JSArray not double
List l = map['integer']; print(l); // JSInt not List
}
https://dartpad.dev/7bc355b3b7779d2b37e1aae2b6def050
並且這在運行時也會失敗,並給出諸如
TypeError: 1.5: type 'JSDouble' is not a subtype of type 'String'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.