带有委托的C#方法调用不明确

带有委托的C#方法调用不明确,c#,compiler-errors,delegates,ambiguous,C#,Compiler Errors,Delegates,Ambiguous,在我的应用程序中,我有如下类似的代码: class Program { static void Main(string[] args) { Method(uri => Task.FromResult(uri)); } static void Method(Func<Uri, Uri> transformer) { throw new NotI

在我的应用程序中,我有如下类似的代码:

class Program
    {
        static void Main(string[] args)
        {
            Method(uri => Task.FromResult(uri));
        }

        static void Method(Func<Uri, Uri> transformer)
        {
            throw new NotImplementedException();
        }

        static void Method(Func<Uri, Task<Uri>> transformer)
        {
            throw new NotImplementedException();
        }
    }
类程序
{
静态void Main(字符串[]参数)
{
方法(uri=>Task.FromResult(uri));
}
静态空隙法(Func变压器)
{
抛出新的NotImplementedException();
}
静态空隙法(Func变压器)
{
抛出新的NotImplementedException();
}
}
正如所料,运行此代码将调用“Method”的第二个重载,该重载需要返回任务的函数委托。但是,如果我更改代码以避免在Main中使用匿名方法:

class Program
    {
        static void Main(string[] args)
        {
            Method(Method2);
        }

        static Task<Uri> Method2(Uri uri)
        {
            return Task.FromResult(uri);
        }

        static void Method(Func<Uri, Uri> transformer)
        {
            throw new NotImplementedException();
        }

        static void Method(Func<Uri, Task<Uri>> transformer)
        {
            throw new NotImplementedException();
        }
    }
类程序
{
静态void Main(字符串[]参数)
{
方法(方法2);
}
静态任务方法2(Uri)
{
返回Task.FromResult(uri);
}
静态空隙法(Func变压器)
{
抛出新的NotImplementedException();
}
静态空隙法(Func变压器)
{
抛出新的NotImplementedException();
}
}
C#编译器现在抱怨我对“方法”的调用不明确。我遗漏了什么?

答案很长(正如里奇拉指出的)

简而言之,C#编译器团队选择让方法组转换(比如
method(Method2)
)忽略返回类型(这里是
Method2
)。这使它们能够灵活地解析
表达式
树。不幸的是,这意味着编译器无法在2
方法
签名之间进行隐式选择


当进行lambda转换时,(<代码>方法(URI=>任务(FromResult)(URI)< /代码>),编译器组不需要担心表达式树解析,所以他们<强> do/s>考虑返回类型。

您没有将URI传递给方法2。@ SamAxe并不意味着。他试图将方法组(
Method2
)转换为委托(
Func
),可能是因为
Func
中的
TResult
是协变的。@M.kazemAkhgary,ReSharper建议解决歧义。问题是为什么会有歧义,因为显然没有从
Func
Method2
@richzilla的隐式转换。这确实是一个重复,答案如下:“这里的原则是,确定方法组可兑换性需要使用过载解决方案从方法组中选择方法,并且过载分辨率不考虑返回类型。”