#dart
#dart
Вопрос:
class A {
final int? b; // Error
}
Ошибка:
Конечная переменная ‘b’ должна быть инициализирована.
Поскольку поле b
обнуляемо, его можно оставить неинициализированным и, следовательно, не требует инициализации. Но это выдает ошибку.
Комментарии:
1. Но оно объявлено как
final
неподвижное. конечные переменные / поля должны иметь инициализатор. защищенный от нуля dart этого не меняет.2. @ChristopherMoore Но это могло бы быть
null
, верно? Итак, почему существует необходимость в инициализации, когда что-то может бытьnull
?
Ответ №1:
Неинициализация final
поля, независимо от того, обнуляемо оно или нет, почти наверняка является ошибкой. Это не отличалось до того, как была введена защита от нуля.
Предположим, что final
полям было разрешено неявно инициализироваться null
. Затем в классе, таком как:
class A {
final int? b;
}
для b
существования вообще не было бы смысла, поскольку оно было бы всегда null
.
Но, возможно, A
предоставляет конструктор, который мог бы инициализировать b
не null
значение:
class A {
final int? b;
A();
A.nonNull() : b = 42;
}
Но теперь нет способа определить, действительно ли A()
конструктор по умолчанию хочет b
, чтобы его инициализировали null
, или программист просто забыл его инициализировать. Последнее гораздо более вероятно, поэтому ошибка Dart заключается в том, что требуется явная инициализация.
Комментарии:
1.
There would be no point for b to exist at all since it'd always be null.
— Даже это было моей первоначальной мыслью, когда я увидел что-то подобное где-то в документах. (Я вернусь к этому позже сегодня).2. Не помню, где я это видел. Но sir
b
должен быть инициализирован в вашем коде вA()
том виде, в каком он отмеченfinal
.3. Ну, да,
A()
необходимо инициализироватьb
, поскольку оно помеченоfinal
. В этом весь смысл; в вашем вопросе спрашивается, зачем его нужно инициализировать.4. Вы думаете о dart.dev/null-safety / … ?
HttpResponse.ok
Конструктор не инициализируетсяerror
, но я думаю, что это, вероятно, ошибка.5. @iLoveDocs Я подал github.com/dart-lang/site-www/issues/2586 чтобы исправить документы. Спасибо, что указали на это.
Ответ №2:
Сначала вам нужно инициализировать b как int b или string b; Присвоение значения необязательно.
Комментарии:
1. Сэр, что
undefined
в Dart?2. Извините, я обновил ответ. Я отвечаю в общем виде, не относящемся к Dart.
3. Ваш ответ все еще очень неясен, и он также кажется вопиюще неправильным.
4. @RahulBeniwal Что вы на самом деле хотите сказать в своем ответе? Пожалуйста, внимательно прочитайте мой вопрос, прежде чем публиковать ответ.