From bbaddf84ccc64e3669e81a178210ca6f972c734d Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 3 Jun 2021 16:33:43 +0200 Subject: [PATCH] Fix #2424: Suppress the string==null special-case within the string class itself. --- ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs | 14 +++----------- .../CSharp/Resolver/CSharpResolver.cs | 2 +- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index 99baef78e..c5ebf5bf7 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -930,16 +930,7 @@ namespace ICSharpCode.Decompiler.CSharp .WithILInstruction(inst); } - OperatorResolveResult rr; - if (left.Type.IsKnownType(KnownTypeCode.String) && right.Type.IsKnownType(KnownTypeCode.String)) - { - rr = null; // it's a string comparison by-value, which is not a reference comparison - } - else - { - rr = resolver.ResolveBinaryOperator(inst.Kind.ToBinaryOperatorType(), left.ResolveResult, right.ResolveResult) - as OperatorResolveResult; - } + OperatorResolveResult rr = resolver.ResolveBinaryOperator(inst.Kind.ToBinaryOperatorType(), left.ResolveResult, right.ResolveResult) as OperatorResolveResult; if (rr == null || rr.IsError || rr.UserDefinedOperatorMethod != null || NullableType.GetUnderlyingType(rr.Operands[0].Type).GetStackType() != inst.InputType || !rr.Type.IsKnownType(KnownTypeCode.Boolean)) @@ -1021,7 +1012,8 @@ namespace ICSharpCode.Decompiler.CSharp if (lhs.Type.Kind == TypeKind.Null) ExtensionMethods.Swap(ref lhs, ref rhs); return rhs.Type.Kind == TypeKind.Null - && (lhs.Type.Kind == TypeKind.Delegate || lhs.Type.IsKnownType(KnownTypeCode.String)); + && (lhs.Type.Kind == TypeKind.Delegate || lhs.Type.IsKnownType(KnownTypeCode.String)) + && lhs.Type.GetDefinition() != decompilationContext.CurrentTypeDefinition; } ExpressionWithResolveResult CreateBuiltinBinaryOperator( diff --git a/ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs b/ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs index 27e173e1b..23171a906 100644 --- a/ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs +++ b/ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs @@ -1310,7 +1310,7 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver if (operatorName == null) return EmptyList.Instance; TypeCode c = ReflectionHelper.GetTypeCode(type); - if (TypeCode.Boolean <= c && c <= TypeCode.Decimal || c == TypeCode.String) + if (TypeCode.Boolean <= c && c <= TypeCode.Decimal) { // The .NET framework contains some of C#'s built-in operators as user-defined operators. // However, we must not use those as user-defined operators (we would skip numeric promotion).