1313using VBSyntax = Microsoft . CodeAnalysis . VisualBasic . Syntax ;
1414using VBSyntaxKind = Microsoft . CodeAnalysis . VisualBasic . SyntaxKind ;
1515using VBasic = Microsoft . CodeAnalysis . VisualBasic ;
16+ using System . Diagnostics . Tracing ;
1617
1718namespace ICSharpCode . CodeConverter . CSharp
1819{
@@ -76,15 +77,15 @@ public RequiredType GetObjectEqualityType(VBSyntax.BinaryExpressionSyntax node,
7677 if ( IsNonEmptyStringLiteral ( vbLeft ) || IsNonEmptyStringLiteral ( vbRight ) ) {
7778 return ( csLeft , csRight ) ;
7879 }
79- return ( VbCoerceToString ( vbLeft , csLeft , lhsTypeInfo ) , VbCoerceToString ( vbRight , csRight , rhsTypeInfo ) ) ;
80+ return ( VbCoerceToNonNullString ( vbLeft , csLeft , lhsTypeInfo ) , VbCoerceToNonNullString ( vbRight , csRight , rhsTypeInfo ) ) ;
8081 }
8182
8283 private static bool IsNonEmptyStringLiteral ( VBSyntax . ExpressionSyntax vbExpr )
8384 {
8485 return vbExpr . SkipParens ( ) . IsKind ( VBSyntaxKind . StringLiteralExpression ) && vbExpr is VBSyntax . LiteralExpressionSyntax literal && ! IsEmptyString ( literal ) ;
8586 }
8687
87- private ExpressionSyntax VbCoerceToString ( VBSyntax . ExpressionSyntax vbNode , ExpressionSyntax csNode , TypeInfo typeInfo )
88+ private ExpressionSyntax VbCoerceToNonNullString ( VBSyntax . ExpressionSyntax vbNode , ExpressionSyntax csNode , TypeInfo typeInfo )
8889 {
8990 bool isStringType = typeInfo . Type . SpecialType == SpecialType . System_String ;
9091
@@ -100,7 +101,12 @@ private ExpressionSyntax VbCoerceToString(VBSyntax.ExpressionSyntax vbNode, Expr
100101 ? SyntaxFactory . ParenthesizedExpression ( Coalesce ( csNode , EmptyStringExpression ( ) ) )
101102 : Coalesce ( csNode , EmptyCharArrayExpression ( ) ) ;
102103
103- return ! isStringType ? NewStringFromArg ( csNode ) : csNode ;
104+ return VbCoerceToString ( csNode , typeInfo ) ;
105+ }
106+
107+ private static ExpressionSyntax VbCoerceToString ( ExpressionSyntax csNode , TypeInfo typeInfo )
108+ {
109+ return typeInfo . Type . SpecialType == SpecialType . System_String ? csNode : NewStringFromArg ( csNode ) ;
104110 }
105111
106112 private bool CanBeNull ( VBSyntax . ExpressionSyntax vbNode )
@@ -200,12 +206,14 @@ private static ExpressionSyntax NegateIfNeeded(VBSyntax.BinaryExpressionSyntax n
200206 {
201207 if ( OptionCompareTextCaseInsensitive ) {
202208 ExtraUsingDirectives . Add ( "System.Globalization" ) ;
209+ ( csLeft , csRight ) = ( VbCoerceToString ( csLeft , lhsTypeInfo ) , VbCoerceToString ( csRight , rhsTypeInfo ) ) ;
203210 var compareOptions = SyntaxFactory . Argument ( GetCompareTextCaseInsensitiveCompareOptions ( ) ) ;
204211 var compareString = SyntaxFactory . InvocationExpression ( ValidSyntaxFactory . MemberAccess ( nameof ( CultureInfo ) , nameof ( CultureInfo . CurrentCulture ) ,
205212 nameof ( CultureInfo . CompareInfo ) , nameof ( CompareInfo . Compare ) ) ,
206213 SyntaxFactory . ArgumentList ( SyntaxFactory . SeparatedList ( new [ ]
207214 { SyntaxFactory . Argument ( csLeft ) , SyntaxFactory . Argument ( csRight ) , compareOptions } ) ) ) ;
208- csLeft = compareString ;
215+
216+ csLeft = compareString ;
209217 csRight = SyntaxFactory . LiteralExpression ( SyntaxKind . NumericLiteralExpression ,
210218 SyntaxFactory . Literal ( 0 ) ) ;
211219 } else {
0 commit comments