假设有这样的条件:
假设这样的场景:
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
的位置?答案 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团队的错误或设计选择。