From 2fb90b49e0e03cf45fd069438a94373d4a64d782 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Mon, 23 Jun 2025 21:15:08 +0200 Subject: [PATCH] Adjust string.Concat handling in ReplaceMethodCallsWithOperators to support unexpanded string.Concat calls. --- .../Transforms/ReplaceMethodCallsWithOperators.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.Decompiler/CSharp/Transforms/ReplaceMethodCallsWithOperators.cs b/ICSharpCode.Decompiler/CSharp/Transforms/ReplaceMethodCallsWithOperators.cs index 36624535b..287d7e3f3 100644 --- a/ICSharpCode.Decompiler/CSharp/Transforms/ReplaceMethodCallsWithOperators.cs +++ b/ICSharpCode.Decompiler/CSharp/Transforms/ReplaceMethodCallsWithOperators.cs @@ -57,8 +57,18 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms var arguments = invocationExpression.Arguments.ToArray(); // Reduce "String.Concat(a, b)" to "a + b" - if (IsStringConcat(method) && context.Settings.StringConcat && CheckArgumentsForStringConcat(arguments)) + if (IsStringConcat(method) && context.Settings.StringConcat) { + if (arguments is [ArrayCreateExpression ace] && method.Parameters is [{ Type: ArrayType }]) + { + arguments = ace.Initializer.Elements.ToArray(); + } + + if (!CheckArgumentsForStringConcat(arguments)) + { + return; + } + bool isInExpressionTree = invocationExpression.Ancestors.OfType().Any( lambda => lambda.Annotation()?.Kind == IL.ILFunctionKind.ExpressionTree); Expression arg0 = arguments[0].Detach();