diff --git a/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj b/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj index 0ec42ecbe..3ff44e2bb 100644 --- a/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj +++ b/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj @@ -130,6 +130,7 @@ + diff --git a/ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs b/ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs index 284b51401..f4ff7c914 100644 --- a/ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs +++ b/ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs @@ -586,6 +586,12 @@ namespace ICSharpCode.Decompiler.Tests await RunForLibrary(cscOptions: cscOptions); } + [Test] + public async Task Comparisons([ValueSource(nameof(defaultOptions))] CompilerOptions cscOptions) + { + await RunForLibrary(cscOptions: cscOptions); + } + [Test] public async Task ConstantsTests([ValueSource(nameof(defaultOptions))] CompilerOptions cscOptions) { diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/Comparisons.cs b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/Comparisons.cs new file mode 100644 index 000000000..5a1df3c9b --- /dev/null +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/Comparisons.cs @@ -0,0 +1,18 @@ +namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty +{ + public class Comparisons + { + private class A + { + } + + private class B + { + } + + private bool CompareUnrelatedNeedsCast(A a, B b) + { + return (object)a == b; + } + } +} diff --git a/ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs b/ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs index 14ab787ba..9e556e6cd 100644 --- a/ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs +++ b/ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs @@ -805,7 +805,10 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver } if (op == BinaryOperatorType.Equality || op == BinaryOperatorType.InEquality) { - if (lhsType.IsReferenceType == true && rhsType.IsReferenceType == true) + if (lhsType.IsReferenceType == true && rhsType.IsReferenceType == true + && (conversions.IdentityConversion(lhsType, rhsType) + || conversions.ExplicitConversion(lhsType, rhsType).IsReferenceConversion + || conversions.ExplicitConversion(rhsType, lhsType).IsReferenceConversion)) { // If it's a reference comparison if (op == BinaryOperatorType.Equality)