如何以声明方式防止函数返回结果?

时间:2013-07-07 13:03:25

标签: dart

假设有这样的条件:

  • 某些操作无法返回结果。
  • 此操作声明为回调
  • 不建议使用typedef
  • 某些操作提供了返回结果。
  • 此操作声明为回调
  • 不建议使用typedef

假设这样的场景:

void main() {
  executeVoidOperation(methodNonVoid);  // Must throw if method void?
  executeNonVoidOperation(methodVoid);  // Must throw if method non-void?
}

int methodNonVoid() {
  return 0;
}

void methodVoid() {
}

void executeVoidOperation(void operation()) {
  operation(); // Must throw if method non-void?
}

void executeNonVoidOperation(dynamic operation()) {
  var result = operation(); // Must throw if method void?
  print(result); // Result of void operation? (if such passed as argument)
}

显示结果:

null

问题(我错在哪里?):

  • Null是对象。如果null函数无法返回结果(as result),void出现null的位置?
  • Dart中具有不同返回类型的函数假定为相同(不冲突)类型?
  • Dart如何调用此函数转换?

1 个答案:

答案 0 :(得分:1)

executeNonVoidOperation(methodVoid);有效,因为回调定义为dynamic operation()dynamic可以是任何内容,包括void。它就像你没有指定类型一样。

null值源于Dart中的简单规则。引自Dart Language Tour

  

所有函数都返回一个值。如果未指定返回值,则该语句返回null;隐式附加到函数体。

这意味着每个void方法始终返回null。如果您尝试返回其他内容,则会出现运行时错误(在已检查模式下)。

executeVoidOperation(methodNonVoid);有点棘手 - 我希望它会引发运行时错误,但似乎回调被视为dynamic operation()而不是void operation()。 Dart Editor的分析仪似乎也认为。这可能是Dart团队的错误或设计选择。