diff --git a/src/Main/Base/Test/MemberLookupHelperTests.cs b/src/Main/Base/Test/MemberLookupHelperTests.cs index 42843e05cf..73c3d61923 100644 --- a/src/Main/Base/Test/MemberLookupHelperTests.cs +++ b/src/Main/Base/Test/MemberLookupHelperTests.cs @@ -153,6 +153,24 @@ namespace ICSharpCode.SharpDevelop.Tests Assert.AreEqual("System.Windows.Forms.ToolStripItem", res.FullyQualifiedName); } + [Test] + public void GetCommonTypeOfStringAndNull() + { + IReturnType res = MemberLookupHelper.GetCommonType(msc, + msc.GetClass("System.String", 0).DefaultReturnType, + NullReturnType.Instance); + Assert.AreEqual("System.String", res.FullyQualifiedName); + } + + [Test] + public void GetCommonTypeOfNullAndString() + { + IReturnType res = MemberLookupHelper.GetCommonType(msc, + NullReturnType.Instance, + msc.GetClass("System.String", 0).DefaultReturnType); + Assert.AreEqual("System.String", res.FullyQualifiedName); + } + [Test] public void GetTypeInheritanceTreeOfClassDerivingFromListOfString() { diff --git a/src/Main/Base/Test/OverloadFinding.cs b/src/Main/Base/Test/OverloadFinding.cs index 683dc02fb5..781a15629d 100644 --- a/src/Main/Base/Test/OverloadFinding.cs +++ b/src/Main/Base/Test/OverloadFinding.cs @@ -47,6 +47,18 @@ namespace ICSharpCode.SharpDevelop.Tests Test("(long.MaxValue)", 0, overloads); } + [Test] public void NullForReferenceTypes() + { + string[] overloads = {"(int a)", "(string a)"}; + Test("(null)", 1, overloads); + } + + [Test] public void NullForNullableType() + { + string[] overloads = {"(int a)", "(int? a)"}; + Test("(null)", 1, overloads); + } + NRefactoryResolverTests nrrt = new NRefactoryResolverTests(); void Test(string callExpr, int num, params string[] signatures) diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/MemberLookupHelper.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/MemberLookupHelper.cs index 91649491fa..9371cc0172 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/MemberLookupHelper.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/MemberLookupHelper.cs @@ -691,8 +691,6 @@ namespace ICSharpCode.SharpDevelop.Dom public static bool IsApplicable(IReturnType argument, IReturnType expected) { - if (argument == null || argument == NullReturnType.Instance) - return true; // "null" can be passed for any argument return ConversionExistsInternal(argument, expected, true); } #endregion @@ -748,6 +746,20 @@ namespace ICSharpCode.SharpDevelop.Dom if (toIsDefault && to.FullyQualifiedName == "System.Object") { return true; // from any type to object } + if (from == NullReturnType.Instance) { + IClass toClass = to.GetUnderlyingClass(); + if (toClass != null) { + switch (toClass.ClassType) { + case ClassType.Class: + case ClassType.Delegate: + case ClassType.Interface: + return true; + case ClassType.Struct: + return toClass.FullyQualifiedName == "System.Nullable"; + } + } + return false; + } if ((toIsDefault || to.IsConstructedReturnType || to.IsGenericReturnType) && (fromIsDefault || from.IsArrayReturnType || from.IsConstructedReturnType))