Generics Dart中具有泛型的扩展方法:类型dynamic can的值';无法从方法返回

Generics Dart中具有泛型的扩展方法:类型dynamic can的值';无法从方法返回,generics,dart,extension-methods,Generics,Dart,Extension Methods,鉴于此 列表上的扩展名{ 列表addAtTheEnd(T值){ 返回此.addAllAtTheEnd([value]); } 列表addAllAtTheEnd(列表值){ 返回[ 这 价值观 ]; } } 在代码编辑器中,this.addAllAtTheEnd([value])带下划线,表示: 无法从方法“addAtTheEnd”返回类型为“List”的值,因为它的返回类型为“List”。 这听起来不合逻辑,因为addAllAtTheEnd方法没有编译错误,我在调用站点(addAtTheEnd

鉴于此

列表上的扩展名{ 列表addAtTheEnd(T值){ 返回此.addAllAtTheEnd([value]); } 列表addAllAtTheEnd(列表值){ 返回[ 这 价值观 ]; } } 在代码编辑器中,
this.addAllAtTheEnd([value])
带下划线,表示:

无法从方法“addAtTheEnd”返回类型为“List”的值,因为它的返回类型为“List”。

这听起来不合逻辑,因为
addAllAtTheEnd
方法没有编译错误,我在调用站点(
addAtTheEnd
)上显式定义了泛型的类型,并使用
This
指示调用该方法的类型


为什么这不起作用?我如何才能使它起作用?

是的,省略
这个
可以解决问题,就像注释中建议的
jamesdlin
一样


我彻底测试了它,结果如下:

这包括:

。。。
列表addAtTheEnd(T值){
返回addAllAtTheEnd([value]);
}
这不是而是

。。。
列表addAtTheEnd(T值){
最终thiz=此;
返回thiz.addAllAtTheEnd([value]);
}
因为它相当于以下内容,其中问题更为明确:

。。。
列表addAtTheEnd(T值){
最终列表thiz=此;
返回thiz.addAllAtTheEnd([value]);
}
但是显式声明类型是有效的:

。。。
列表addAtTheEnd(T值){
最终列表thiz=此;
返回thiz.addAllAtTheEnd([value]);
}
有趣的事实:
dart linter
如果启用了该lint规则,则会抱怨解决方案,即

因此,调用
this
的正确明确用法如下:

...
  List<T> addAtTheEnd(T value) {
    // ignore: omit_local_variable_types
    final List<T> thiz = this;
    return thiz.addAllAtTheEnd([value]);
  }
。。。
列表addAtTheEnd(T值){
//忽略:忽略\本地\变量\类型
最终列表thiz=此;
返回thiz.addAllAtTheEnd([value]);
}
如果以以下方式将其用于内联显式转换:


列表addAtTheEnd(T值){
return(作为列表)。addAllAtTheEnd([value]);
}

您会收到一条警告,自动修复会很乐意帮助您将代码转换为不可编译。

我不知道为什么
dartanalyzer
会抱怨
List
,但似乎您可以通过将
this.addAllAtTheEnd(…)
更改为
addAllAtTheEnd(…)
来修复它。顺便说一句,您可以使用
List.append
来添加单个元素,使用
+=
来添加另一个
List
。我知道
append
函数,我的目标是创建一个最小的可复制示例,但感谢您指出它。我会看看它在没有
这个
的情况下是否有效。我之所以用
这个
来写它,是因为没有它,智能补全就无法工作。你让我开心!非常感谢。