diff --git a/src/Compilers/CSharp/Portable/Binder/Semantics/OverloadResolution/OverloadResolution.cs b/src/Compilers/CSharp/Portable/Binder/Semantics/OverloadResolution/OverloadResolution.cs index fd6e17709465f..ad540ca6df430 100644 --- a/src/Compilers/CSharp/Portable/Binder/Semantics/OverloadResolution/OverloadResolution.cs +++ b/src/Compilers/CSharp/Portable/Binder/Semantics/OverloadResolution/OverloadResolution.cs @@ -3404,7 +3404,8 @@ private MemberResolutionResult IsMemberApplicableInExpandedForm( result.Member, result.LeastOverriddenMember, - MemberAnalysisResult.ExpandedForm(result.Result.ArgsToParamsOpt, result.Result.ConversionsOpt, hasAnyRefOmittedArgument)) : + MemberAnalysisResult.ExpandedForm(result.Result.ArgsToParamsOpt, result.Result.ConversionsOpt, hasAnyRefOmittedArgument), + hasTypeArgumentInferredFromFunctionType: result.HasTypeArgumentInferredFromFunctionType) : result; } diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/DelegateTypeTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/DelegateTypeTests.cs index fc21e2c84c9c1..f41b2be42c353 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/DelegateTypeTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/DelegateTypeTests.cs @@ -4371,6 +4371,58 @@ static void Main() CompileAndVerify(source, expectedOutput: expectedOutput); } + [WorkItem(57627, "https://github.com/dotnet/roslyn/issues/57627")] + [Fact] + public void OverloadResolution_48() + { + var source = +@"using System; +using System.Threading.Tasks; + +delegate void MyAction(); +delegate T MyFunc(); + +class A +{ + public static void F(object o) { Console.WriteLine(""F(object o)""); } + public static void F(object o, string format, params object[] args) { Console.WriteLine(""F(object o, string format, params object[] args)""); } + + public static void F(T t) { Console.WriteLine(""F(T t)""); } + public static void F(T t, string format, params object[] args) { Console.WriteLine(""F(T t, string format, params object[] args)""); } + + public static void F(MyAction a) { Console.WriteLine(""F(MyAction a)""); } + public static void F(MyAction a, string format, params object[] args) { Console.WriteLine(""F(MyAction a, string format, params object[] args)""); } + + public static void F(MyFunc f) { Console.WriteLine(""F(MyFunc f)""); } + public static void F(MyFunc f, string format, params object[] args) { Console.WriteLine(""F(MyFunc f, string format, params object[] args)""); } +} + +class B +{ + static async Task Main() + { + A.F(() => { }); + A.F(() => { }, """"); + A.F(() => { }, ""{0}"", 1); + A.F(async () => await Task.FromResult(null)); + A.F(async () => await Task.FromResult(null), """"); + A.F(async () => await Task.FromResult(null), ""{0}"", 1); + } +}"; + + string expectedOutput = +@"F(MyAction a) +F(MyAction a, string format, params object[] args) +F(MyAction a, string format, params object[] args) +F(MyFunc f) +F(MyFunc f, string format, params object[] args) +F(MyFunc f, string format, params object[] args) +"; + CompileAndVerify(source, parseOptions: TestOptions.Regular9, expectedOutput: expectedOutput); + CompileAndVerify(source, parseOptions: TestOptions.Regular10, expectedOutput: expectedOutput); + CompileAndVerify(source, expectedOutput: expectedOutput); + } + [Fact] public void BestCommonType_01() {