diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/Conversions.cs b/ICSharpCode.NRefactory.CSharp/Resolver/Conversions.cs index e9c53ae3be..c73938c007 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/Conversions.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/Conversions.cs @@ -804,7 +804,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver } var or = rr.PerformOverloadResolution(compilation, args, allowExpandingParams: false, conversions: this); if (or.FoundApplicableCandidate) - return Conversion.MethodGroupConversion((IMethod)or.BestCandidate); + return Conversion.MethodGroupConversion((IMethod)or.GetBestCandidateWithSubstitutedTypeArguments()); else return Conversion.None; } diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/TypeInference.cs b/ICSharpCode.NRefactory.CSharp/Resolver/TypeInference.cs index 9d7ca54225..349cf81d26 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/TypeInference.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/TypeInference.cs @@ -513,7 +513,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver allowExtensionMethods: false, allowExpandingParams: false); if (or.FoundApplicableCandidate && or.BestCandidateAmbiguousWith == null) { - IType returnType = or.BestCandidate.ReturnType; + IType returnType = or.GetBestCandidateWithSubstitutedTypeArguments().ReturnType; MakeLowerBoundInference(returnType, m.ReturnType); } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs index 2bc9f0fbf3..b124007fc2 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs @@ -19,10 +19,10 @@ using System; using System.IO; using System.Linq; - using ICSharpCode.NRefactory.CSharp.TypeSystem; using ICSharpCode.NRefactory.Semantics; using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.NRefactory.TypeSystem.Implementation; using NUnit.Framework; namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -343,5 +343,25 @@ class Derived : Base where T : Derived Assert.IsFalse(rr.IsError); Assert.AreEqual(0, rr.Member.Parameters.Count); } + + [Test] + public void MethodGroupConversionForGenericMethodHasSpecializedMethod() + { + string program = @"using System; +class TestClass { + void F(T x) {} + public void M() { + System.Action f; + f = $F$; + } +}"; + var conversion = GetConversion(program); + Assert.IsTrue(conversion.IsValid); + Assert.IsTrue(conversion.IsMethodGroupConversion); + Assert.IsInstanceOf(conversion.Method); + Assert.AreEqual( + new[] { "System.Int32" }, + ((SpecializedMethod)conversion.Method).TypeArguments.Select(t => t.ReflectionName).ToArray()); + } } }