Как отладить ошибку типа значения по умолчанию 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.

Другие вопросы по тегам