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)