Browse Source

Merge pull request #94 from erik-kallen/InvokeGenericMethodWithNullableTypeArgument

Invoke generic method with nullable type argument
newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
8ede23f8cb
  1. 2
      ICSharpCode.NRefactory.CSharp/Resolver/OverloadResolution.cs
  2. 48
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/InvocationTests.cs

2
ICSharpCode.NRefactory.CSharp/Resolver/OverloadResolution.cs

@ -507,7 +507,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
if (!ctors.Any()) if (!ctors.Any())
return false; return false;
} }
foreach (IType constraintType in typeParameter.DirectBaseTypes) { foreach (IType constraintType in typeParameter.DirectBaseTypes.Where(tp => !tp.IsKnownType(KnownTypeCode.Object))) {
IType c = constraintType; IType c = constraintType;
if (substitution != null) if (substitution != null)
c = c.AcceptVisitor(substitution); c = c.AcceptVisitor(substitution);

48
ICSharpCode.NRefactory.Tests/CSharp/Resolver/InvocationTests.cs

@ -635,5 +635,53 @@ class Test
Assert.AreEqual(OverloadResolutionErrors.MethodConstraintsNotSatisfied, rr.OverloadResolutionErrors); Assert.AreEqual(OverloadResolutionErrors.MethodConstraintsNotSatisfied, rr.OverloadResolutionErrors);
Assert.IsTrue(rr.IsError); Assert.IsTrue(rr.IsError);
} }
[Test]
public void MethodCanBeInvokedWithNullableTypeArgument1() {
string program = @"
public class C {
static T F<T>() {
return default(T);
}
void M() {
$F<int?>()$;
}
}";
var rr = Resolve<CSharpInvocationResolveResult>(program);
Assert.IsFalse(rr.IsError);
}
[Test]
public void MethodCanBeInvokedWithNullableTypeArgument2() {
string program = @"
public class C {
static T F<T>(T t) {
return default(T);
}
void M() {
$F((int?)null)$;
}
}";
var rr = Resolve<CSharpInvocationResolveResult>(program);
Assert.IsFalse(rr.IsError);
}
[Test]
public void CanConstructGenericTypeWithNullableTypeArgument() {
string program = @"
public class X<T> {}
public class C {
void M() {
$new X<int?>()$;
}
}";
var rr = Resolve<CSharpInvocationResolveResult>(program);
Assert.IsFalse(rr.IsError);
}
} }
} }

Loading…
Cancel
Save