From a00495c22b4fdb797b008741218580f8a01f8bc1 Mon Sep 17 00:00:00 2001 From: erikkallen Date: Tue, 14 Aug 2012 16:09:12 +0200 Subject: [PATCH 1/2] Test that demonstrates that a generic method cannot be invoked with a nullable type argument. --- .../CSharp/Resolver/InvocationTests.cs | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) 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); + } } } From 9c521f899233391a68cafb49b11df60448fdde31 Mon Sep 17 00:00:00 2001 From: erikkallen Date: Tue, 14 Aug 2012 16:37:12 +0200 Subject: [PATCH 2/2] Fixed issue with nullable types not being usable as generic arguments. --- ICSharpCode.NRefactory.CSharp/Resolver/OverloadResolution.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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);