我可能在语法或实际上做错了所以“不要这样做”可能是有效的,但似乎这应该有效:
class Thing {
//static dynamic noop = () { }; // fails
static dynamic noop = ([dynamic value]) { }; // works for null cases
dynamic _callback;
Thing._([dynamic callback([dynamic value])])
: this._callback = callback != null ? callback : Thing.noop;
factory Thing([dynamic callback([dynamic value])]) {
return new Thing._(callback);
}
}
当我运行这些测试时,第一个测试失败但第二次,第三次和第四次测试失败:
//Caught type '() => dynamic' is not a subtype of type '([dynamic]) => dynamic' of 'callback'.
test('callback with optional param', () {
var thing = new Thing(() { });
thing.doCallback();
thing.doCallback('data');
});
test('callback with optional param', () {
var thing = new Thing(([_]) { });
thing.doCallback();
thing.doCallback('data');
});
test('callback with optional param', () {
var thing = new Thing();
thing.doCallback();
thing.doCallback('data');
});
test('callback with optional param', () {
var thing = new Thing(null);
thing.doCallback();
thing.doCallback('data');
});
答案 0 :(得分:2)
dynamic callback([dynamic value])
表示callback
可以带一个参数或不带参数。在您的第一个测试用例中,您提供的回调(() { }
)仅处理没有参数的调用。所以它不尊重合同。这就是你得到这个错误的原因。