2

假设这样的条件:

  • 某些操作不提供返回结果的可能性。
  • 此操作声明为回调
  • 不推荐使用 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 resultvoidnull
  • Dart 中具有不同返回类型的函数假定为相同(不冲突)类型?
  • Dart 中如何将此函数称为转换?
4

1 回答 1

2

executeNonVoidOperation(methodVoid);有效,因为回调被定义为dynamic operation(). dynamic可以是任何东西,包括void. 就像您不指定类型一样。

null值源于 Dart 中的一个简单规则。引自Dart 语言之旅

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

这意味着每个void方法总是返回 null。如果您尝试返回其他内容,您将收到运行时错误(在检查模式下)。

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

于 2013-07-08T09:11:36.333 回答