当我使用这个通用方法时,我会得到这个错误。
类型'num‘的值不能分配给'T’类型的变量。尝试更改变量的类型,或将右侧类型转换为“T”。
这里的错误是什么
sums<T extends num>(List<T> list) {
  T res =list[0];
  for (var i = 1; i < list.length; i++) {
   res = res + list[i];
  }
  print(res);
}发布于 2021-03-20 21:01:49
这似乎是Dart 2.12+的一个bug或一个误解的特性。在这两种情况下,可能都值得在Dart Github页面上打开一个问题。
如果我在2.12.0中运行以下代码:
void main() {
  final nums = [1, 2.0, 3.5];
  final ints = [1, 2, 3];
  final doubles = [1.1, 2.2, 3.3];
  
  sums(nums);
  sums(ints);
  sums(doubles);
}
void sums<T extends num>(List<T> list) {
  T res = list[0];
  for (var i = 1; i < list.length; i++) {
    res = res + list[i];
  }
  print(res);
}我知道你提到的错误:
main.dart:14:9: Error: A value of type 'num' can't be assigned to a variable of type 'T'.
    res = res + list[i];
              ^但是,如果我在Dart 2.10.5中运行相同的代码,程序编译和运行就没有问题,并得到以下打印输出:
6.5
6
6.6我最好的猜测是,在涉及List的类型参数时,类型推断存在一个问题。它不是接受传递给sums的实际类型参数,而是将类型约束num作为它的推断类型。因此,类型系统看到您正在向一个num中添加一个T extends num,然后将它分配给后者。(为了解释,假设T是int。一个num加上一个int将导致num。尝试将其分配给int会导致类型错误,因为对于所有类型系统都知道,num实际上可能是一个double。)
无论如何,一旦您执行错误建议并将list的元素转换为T,错误就会消失。
void sums<T extends num>(List<T> list) {
  T res = list[0] as T;
  for (var i = 1; i < list.length; i++) {
    res = res + list[i] as T;
  }
  print(res);
}
// Prints:
//
// 6.5
// 6
// 6.6然而,有趣的是,使用加法分配会导致相同的错误,而不管强制转换是什么:
void sums<T extends num>(List<T> list) {
  T res = list[0];
  for (var i = 1; i < list.length; i++) {
    res += list[i] as T;
  }
  print(res);
}
// Prints:
//
// main.dart:14:9: Error: A value of type 'num' can't be assigned to a variable of type 'T'.
//     res += list[i];
//         ^编辑:我已经在Dart SDK Github页面上为这个主题提交了一个问题。
编辑2:原来这不是一个bug,而是作为2.12的一部分对Dart的预期更改的结果。详见欧文的回答。
https://stackoverflow.com/questions/66725731
复制相似问题