From 37d93aaaa98f204997e942fbbd461ecae2e7b88b Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2026 23:35:55 +0000 Subject: [PATCH] Fix Issue #1089: Don't optimize Option Compare Text empty string checks to string.IsNullOrEmpty() Under Option Compare Text, Visual Basic evaluates certain invisible character strings as equal to `""`. Optimizing this down to `string.IsNullOrEmpty` in C# breaks correct behavior because C# considers these strings non-empty. This commit skips the null/empty optimization when `OptionCompareTextCaseInsensitive` is true, causing it to fall back to `CultureInfo.CurrentCulture.CompareInfo.Compare` logic. Co-authored-by: GrahamTheCoder <2490482+GrahamTheCoder@users.noreply.github.com> --- CodeConverter/CSharp/VisualBasicEqualityComparison.cs | 6 ++++++ Tests/CSharp/ExpressionTests/StringExpressionTests.cs | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CodeConverter/CSharp/VisualBasicEqualityComparison.cs b/CodeConverter/CSharp/VisualBasicEqualityComparison.cs index 6a70cf5cd..b05a643a5 100644 --- a/CodeConverter/CSharp/VisualBasicEqualityComparison.cs +++ b/CodeConverter/CSharp/VisualBasicEqualityComparison.cs @@ -179,6 +179,12 @@ private static ObjectCreationExpressionSyntax NewStringFromArg(ExpressionSyntax public bool TryConvertToNullOrEmptyCheck(VBSyntax.BinaryExpressionSyntax node, ExpressionSyntax lhs, ExpressionSyntax rhs, out CSharpSyntaxNode? visitBinaryExpression) { + if (OptionCompareTextCaseInsensitive) + { + visitBinaryExpression = null; + return false; + } + bool lhsEmpty = IsNothingOrEmpty(node.Left); bool rhsEmpty = IsNothingOrEmpty(node.Right); diff --git a/Tests/CSharp/ExpressionTests/StringExpressionTests.cs b/Tests/CSharp/ExpressionTests/StringExpressionTests.cs index 60cd54222..414ba0e54 100644 --- a/Tests/CSharp/ExpressionTests/StringExpressionTests.cs +++ b/Tests/CSharp/ExpressionTests/StringExpressionTests.cs @@ -208,11 +208,11 @@ public void Foo() { throw new Exception(); } - if (string.IsNullOrEmpty(s1)) + if (CultureInfo.CurrentCulture.CompareInfo.Compare(s1 ?? """", """", CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth) == 0) { // } - if (string.IsNullOrEmpty(s1)) + if (CultureInfo.CurrentCulture.CompareInfo.Compare(s1 ?? """", """", CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth) == 0) { // }