diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/OverloadResolution.cs b/ICSharpCode.NRefactory.CSharp/Resolver/OverloadResolution.cs index ce1ce09570..01e9dfb633 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/OverloadResolution.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/OverloadResolution.cs @@ -507,7 +507,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver if (!ctors.Any()) return false; } - foreach (IType constraintType in typeParameter.DirectBaseTypes) { + foreach (IType constraintType in typeParameter.DirectBaseTypes.Where(tp => !tp.IsKnownType(KnownTypeCode.Object))) { IType c = constraintType; if (substitution != null) c = c.AcceptVisitor(substitution); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/InvocationTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/InvocationTests.cs index 5814490df3..96ea8a5af4 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/InvocationTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/InvocationTests.cs @@ -635,5 +635,53 @@ class Test Assert.AreEqual(OverloadResolutionErrors.MethodConstraintsNotSatisfied, rr.OverloadResolutionErrors); Assert.IsTrue(rr.IsError); } + + [Test] + public void MethodCanBeInvokedWithNullableTypeArgument1() { + string program = @" +public class C { + static T F() { + return default(T); + } + + void M() { + $F()$; + } +}"; + + var rr = Resolve(program); + Assert.IsFalse(rr.IsError); + } + + [Test] + public void MethodCanBeInvokedWithNullableTypeArgument2() { + string program = @" +public class C { + static T F(T t) { + return default(T); + } + + void M() { + $F((int?)null)$; + } +}"; + + var rr = Resolve(program); + Assert.IsFalse(rr.IsError); + } + + [Test] + public void CanConstructGenericTypeWithNullableTypeArgument() { + string program = @" +public class X {} +public class C { + void M() { + $new X()$; + } +}"; + + var rr = Resolve(program); + Assert.IsFalse(rr.IsError); + } } }