Как отладить ошибку типа значения по умолчанию Null Safety на двойном вопросительном знаке '??'
Недавно я столкнулся со странным поведением при использовании двойного вопросительного знака. Вот пример кода:
void main() {
String strA;
String strB;
print('start');
strB = strA ?? 5; // wrong use of default value type. It should be a String here.
print('end');
}
Программа никогда не запускается до конца и даже не выкидывает никаких сообщений об ошибках.
Ожидается ли такое поведение?
1 ответ
Как вы запускаете этот код?
Когда я запускаю его, я получаю такой результат:
▶ dart test.dart
start
Unhandled exception:
type 'int' is not a subtype of type 'String'
#0 main (file:///Users/renato/programming/projects/test.dart:6:3)
Как я и предполагал.
Какую версию Dart вы используете (запустите
dart --version
)? Убедитесь, что у вас установлена последняя версия, например
2.10
.
Если у вас все еще есть проблемы, возможно, у вас есть местный
analysis_options.yaml
файл, который отменяет проверки компилятора Dart, чтобы быть более снисходительным, и в этом случае он может не проверять типы (я не уверен, какой параметр включит это, но я полагаю, что это возможно).
Проверить, как работают варианты анализа, можно здесь.
Я предлагаю вам всегда включать "сильный режим", добавляя это в свой файл параметров анализа:
analyzer:
strong-mode:
implicit-casts: false
implicit-dynamic: false
Кстати, если вы хотите попробовать новую экспериментальную функцию Dart NNBD (Not-Null-By-Default), вам нужно использовать выпуски канала разработчиков Dart и запускать свою программу с
dart --enable-experiment=non-nullable file.dart
.
Чтобы узнать, как включить NNBD, прочтите об этом сообщение блога null-safety tech preview 2.