Dart:无法将 'int' 类型的值分配给 'int' 类型的变量

Dart: A value of type 'int' can't be assigned to a variable of type 'int'

当我这样写扩展时:

extension MyExtension<int> on List<int> {
  void myMethod() {
    int a = 1; // error
  }
}

我从编译器收到一条看似荒谬的错误消息:

A value of type 'int' can't be assigned to a variable of type 'int'. Try changing the type of the variable, or casting the right-hand type to 'int'. dart(invalid_assignment)

我可以通过删除扩展名后的 <int> 来解决问题:

extension MyExtension on List<int> {
  void myMethod() {
    int a = 1;
  }
}

但我想知道原来有问题的代码是怎么回事。神秘错误消息的原因是什么?

所以你遇到了一个简单的问题,你正在重新分配 int 的含义

extension MyExtension<int> on List<int>

您的扩展接受一个类型参数,这意味着在使用扩展时,您可以向它传递许多不同的类型,但这个新类型参数的名称是 int.

因此您将 int(数字)分配给 int(类型参数),这是不可能的,因为 dart 不知道 int(类型参数)是否为 int。

为了解决这个问题,你可以像你一样删除类型参数,你显示的代码不需要类型参数,你也可以重命名类型参数,约定说类型参数应该被称为T:

extension MyExtension<T> on List<int> ...

如果您希望类型参数始终为 int,或者 class 扩展 int,您还可以声明:

extension MyExtension<T extends int> on List<int> ...

如果您仍然无法理解什么是类型参数及其工作原理,here is the documentation for type arguments and here is the documentation for extensions with type arguments