@@ -79,6 +79,7 @@ public RequiredType GetObjectEqualityType(params TypeInfo[] typeInfos)
7979
8080 if ( typeInfos . All (
8181 t => t . Type == null || t . Type . SpecialType == SpecialType . System_String ||
82+ t . Type . SpecialType == SpecialType . System_Char ||
8283 t . Type . IsArrayOf ( SpecialType . System_Char ) ) ) {
8384 return RequiredType . StringOnly ;
8485 }
@@ -177,20 +178,38 @@ private static ObjectCreationExpressionSyntax NewStringFromArg(ExpressionSyntax
177178 }
178179
179180 public bool TryConvertToNullOrEmptyCheck ( VBSyntax . BinaryExpressionSyntax node , ExpressionSyntax lhs ,
180- ExpressionSyntax rhs , out CSharpSyntaxNode ? visitBinaryExpression )
181+ ExpressionSyntax rhs , TypeInfo lhsTypeInfo , TypeInfo rhsTypeInfo , out CSharpSyntaxNode ? visitBinaryExpression )
181182 {
182- if ( OptionCompareTextCaseInsensitive )
183- {
184- visitBinaryExpression = null ;
185- return false ;
186- }
187-
188183 bool lhsEmpty = IsNothingOrEmpty ( node . Left ) ;
189184 bool rhsEmpty = IsNothingOrEmpty ( node . Right ) ;
190185
191186 if ( lhsEmpty || rhsEmpty )
192187 {
193188 var arg = lhsEmpty ? rhs : lhs ;
189+ var argType = lhsEmpty ? rhsTypeInfo : lhsTypeInfo ;
190+
191+ if ( argType . Type ? . SpecialType == SpecialType . System_Char ) {
192+ // char = "" in VB means char == '\0' (char.MinValue) in C#; not affected by OptionCompareText
193+ var charMinValue = SyntaxFactory . MemberAccessExpression ( SyntaxKind . SimpleMemberAccessExpression ,
194+ SyntaxFactory . PredefinedType ( SyntaxFactory . Token ( SyntaxKind . CharKeyword ) ) ,
195+ ValidSyntaxFactory . IdentifierName ( "MinValue" ) ) ;
196+ var equalityKind = node . IsKind ( VBasic . SyntaxKind . NotEqualsExpression ) ? SyntaxKind . NotEqualsExpression : SyntaxKind . EqualsExpression ;
197+ var opToken = SyntaxFactory . Token ( node . IsKind ( VBasic . SyntaxKind . NotEqualsExpression ) ? SyntaxKind . ExclamationEqualsToken : SyntaxKind . EqualsEqualsToken ) ;
198+ visitBinaryExpression = SyntaxFactory . BinaryExpression ( equalityKind , arg , opToken , charMinValue ) ;
199+ return true ;
200+ }
201+
202+ if ( OptionCompareTextCaseInsensitive )
203+ {
204+ visitBinaryExpression = null ;
205+ return false ;
206+ }
207+
208+ if ( argType . Type ? . SpecialType != SpecialType . System_String && argType . Type ? . SpecialType != SpecialType . System_Object ) {
209+ visitBinaryExpression = null ;
210+ return false ;
211+ }
212+
194213 var nullOrEmpty = SyntaxFactory . InvocationExpression (
195214 SyntaxFactory . MemberAccessExpression ( SyntaxKind . SimpleMemberAccessExpression ,
196215 SyntaxFactory . PredefinedType ( SyntaxFactory . Token ( SyntaxKind . StringKeyword ) ) ,
@@ -207,7 +226,7 @@ public bool TryConvertToNullOrEmptyCheck(VBSyntax.BinaryExpressionSyntax node, E
207226 return false ;
208227 }
209228
210- private bool IsNothingOrEmpty ( VBSyntax . ExpressionSyntax expressionSyntax )
229+ public bool IsNothingOrEmpty ( VBSyntax . ExpressionSyntax expressionSyntax )
211230 {
212231 expressionSyntax = expressionSyntax . SkipIntoParens ( ) ;
213232
0 commit comments