Последствия автоматического литья с двойным дротиком / флаттером

#flutter #dart #casting #type-systems

#флаттер #дротик #Кастинг #тип-системы

Вопрос:

Каковы последствия использования int were a double требуется? dart позволяет вам объявлять double без .0 if оно равно 0 и обрабатывать его как double без какого-либо приведения во время выполнения?

Думает, что это заставляет меня беспокоиться об этом:

  • Я не вижу ни одного линтера, говорящего, что это приведет к int превращению double в.
  • Он отлично компилируется.
  • height Поле является двойным, но оно принимает int .

Взгляните на примеры:

версия int

 SizedBox(height: 10)

# Or 
final double a = 2;
 

двойная версия

 SizedBox(height: 10.0)

# Or 
final double a = 2.0;
 

Ответ №1:

Если вы посмотрите на реализацию SizedBox, вы увидите, что высота поля имеет тип double . введите описание изображения здесь

Чтобы понять, что происходит в вашем коде, который у вас есть в качестве примера, вы должны понимать, как работает вывод типов. В первом приведенном вами примере кода (int version), даже если вы написали 10, а не 10.0, компилятор Dart выводит это значение как double, потому что высота файла имеет этот тип. Вы явно не указываете, что значение, которое вы указываете в качестве параметра, равно int, поэтому оно рассматривается как double . Если вы зададите в качестве значения целое число (вы укажете тип int), у вас будет следующая ошибка времени компиляции:

введите описание изображения здесь

Итак, в заключение, в обоих ваших примерах Dart выводит тип как double, потому что вы явно не указываете, что это целое число.

Вы можете прочитать больше о выводе типа дротика здесь: https://dart.dev/guides/language/type-system#type-inference

Ответ №2:

Автоматическое преобразование времени выполнения между int и отсутствует double . double a = 2; это просто синтаксический сахар double a = 2.0; , который происходит во время компиляции, и именно поэтому он работает только для целочисленных литералов.