|
|
|
@ -670,6 +670,58 @@ public class C {
@@ -670,6 +670,58 @@ public class C {
|
|
|
|
|
Assert.IsFalse(rr.IsError); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
[Test] |
|
|
|
|
public void MethodCanBeInvokedWithNullableTypeArgument3() { |
|
|
|
|
string program = @"
|
|
|
|
|
public class C { |
|
|
|
|
static T F<T, U>() where T : U { |
|
|
|
|
return default(T); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void M() { |
|
|
|
|
$F<int?, object>()$; |
|
|
|
|
} |
|
|
|
|
}";
|
|
|
|
|
|
|
|
|
|
var rr = Resolve<CSharpInvocationResolveResult>(program); |
|
|
|
|
Assert.IsFalse(rr.IsError); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
[Test] |
|
|
|
|
public void MethodWithStructContraintCanBeInvokedWithValueType() { |
|
|
|
|
string program = @"
|
|
|
|
|
public class C { |
|
|
|
|
static T F<T>() where T : struct { |
|
|
|
|
return default(T); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void M() { |
|
|
|
|
$F<int>()$; |
|
|
|
|
} |
|
|
|
|
}";
|
|
|
|
|
|
|
|
|
|
var rr = Resolve<CSharpInvocationResolveResult>(program); |
|
|
|
|
Assert.IsFalse(rr.IsError); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
[Test] |
|
|
|
|
public void MethodWithStructContraintCannotBeInvokedWithNullableValueType() { |
|
|
|
|
string program = @"
|
|
|
|
|
public class C { |
|
|
|
|
static T F<T>() where T : struct { |
|
|
|
|
return default(T); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void M() { |
|
|
|
|
$F<int?>()$; |
|
|
|
|
} |
|
|
|
|
}";
|
|
|
|
|
|
|
|
|
|
var rr = Resolve<CSharpInvocationResolveResult>(program); |
|
|
|
|
Assert.IsTrue(rr.IsError); |
|
|
|
|
Assert.AreEqual(OverloadResolutionErrors.MethodConstraintsNotSatisfied, rr.OverloadResolutionErrors); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
[Test] |
|
|
|
|
public void CanConstructGenericTypeWithNullableTypeArgument() { |
|
|
|
|
string program = @"
|
|
|
|
|