对于如何选择重载,我遇到了一些意想不到的行为:
[TestFixture]
public class Foo {
[Test]
public void Do() {
Do(() => {
Console.WriteLine("Action Do");
});
try {
Do(() => {
Console.WriteLine("Func Do");
throw new Exception();
});
} catch { }
}
public void Do(Action a) {
a();
}
public void Do(Func<int> a) {
a();
}
}
这将输出:
Action Do
Func Do
基本上,第二次调用Do虽然仍未返回值,但选择需要`Func的重载。
我最好的猜测是因为它总是以异常结束,编译器可以合法地选择任一签名。但是,在这一点上,选择一个在另一个上并且允许一个明显永远不会返回与Func<T>
而不是Action
匹配的lambda的原因是什么?