奇怪的方法过载选择行为

时间:2014-06-25 21:15:01

标签: c# overloading lambda

对于如何选择重载,我遇到了一些意想不到的行为:

[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的原因是什么?

0 个答案:

没有答案