Dart语言无效返回方法

时间:2019-11-12 18:02:02

标签: dart

我再次花了几个小时在飞镖程序中发现一种奇怪的行为。
我问我以下原因以及在编译器级别是否有事情要做。
该代码仅是关于在Map中设置和删除条目以及跟踪删除操作:

static void removeLock(String key) {
    Lock lock = _locks.remove(key);
    if (lock !=null) return
    print ( " uniqueId $key was not locked ");
  }

地图文档说,如果删除之前对象在地图中,则remove返回该对象。
在编写时,代码会始终显示密钥不在地图中。
原始错误很明显:开发人员忘了在返回后放分号:

if (lock !=null)  return ; 

第一个问题是:为什么编译器未检测到此问题?

我的分析是Dart尝试返回 print调用的结果,该结果是无效的,因此可以使用该方法的签名。 QED。

问题二:有什么方法可以防止这种错误;
为什么可以允许对return语句进行void函数调用?
这是一个真正的用例吗?

1 个答案:

答案 0 :(得分:0)

编译器未检测到此问题的原因是该程序有效

推断时,void函数中允许返回print(...)这样的void表达式的结果。出于历史原因,主要是

在Dart 1中,类型注释不会影响语言语义(类型是可选的),因此无论返回类型为void,函数都应相同地工作。您只能获得警告,以及在“检查模式”下运行时的一些运行时错误。因此,没有禁止从void函数返回内容的规则,唯一适用的规则是同一函数中不能同时包含return;return e;语句,甚至那只是一个警告。 因此,您可以可以return e;函数中写入void,并且只需检查值是否为null,它便可以检查(仅在检查模式下)。 / p>

因此,编写了很多代码,返回了void表达式的值,尤其是当=>之类的函数void foo() => voidBody();时。

当移至现在在编译时检查类型系统的Dart 2时,认为使太多现有代码无效是不可行的,因此Dart 2仍允许{{1}中的return voidExpression(); }功能。