@@ -642,14 +642,14 @@ public override async Task<SyntaxList<StatementSyntax>> VisitSelectBlock(VBSynta
642642 {
643643 var vbExpr = node . SelectStatement . Expression ;
644644 var vbEquality = CommonConversions . VisualBasicEqualityComparison ;
645- var ( csSwitchExpr , stmts , csExprToReuse ) = await GetExpressionWithoutSideEffectsAsync ( vbExpr , "switchExpr" ) ;
645+ var ( csExprToReuse , stmts , csSwitchExpr ) = await GetExpressionWithoutSideEffectsAsync ( vbExpr , "switchExpr" ) ;
646646 var switchExprTypeInfo = _semanticModel . GetTypeInfo ( vbExpr ) ;
647- var isStringComparison = switchExprTypeInfo . ConvertedType ? . SpecialType == SpecialType . System_String ;
647+ var isStringComparison = switchExprTypeInfo . ConvertedType ? . SpecialType == SpecialType . System_String || switchExprTypeInfo . ConvertedType ? . IsArrayOf ( SpecialType . System_Char ) == true ;
648648 var caseInsensitiveStringComparison = vbEquality . OptionCompareTextCaseInsensitive &&
649649 isStringComparison ;
650650 if ( isStringComparison ) {
651- csSwitchExpr = vbEquality . VbCoerceToNonNullString ( vbExpr , csSwitchExpr , switchExprTypeInfo ) ;
652651 csExprToReuse = vbEquality . VbCoerceToNonNullString ( vbExpr , csExprToReuse , switchExprTypeInfo ) ;
652+ csSwitchExpr = vbEquality . VbCoerceToNonNullString ( vbExpr , csSwitchExpr , switchExprTypeInfo ) ;
653653 }
654654
655655 var usedConstantValues = new HashSet < object > ( ) ;
@@ -665,15 +665,16 @@ public override async Task<SyntaxList<StatementSyntax>> VisitSelectBlock(VBSynta
665665 var constantValue = _semanticModel . GetConstantValue ( s . Value ) ;
666666 var caseTypeInfo = _semanticModel . GetTypeInfo ( s . Value ) ;
667667 var notAlreadyUsed = ! constantValue . HasValue || usedConstantValues . Add ( constantValue . Value ) ;
668- var csCase = correctTypeExpressionSyntax . Expr ;
669668
670669 // Pass both halves in case we can optimize away the check based on the switch expr
671- if ( isStringComparison && ! caseInsensitiveStringComparison ) {
672- csCase = vbEquality . VbCoerceToNonNullString ( vbExpr , csExprToReuse , switchExprTypeInfo , true , s . Value , correctTypeExpressionSyntax . Expr , caseTypeInfo , false ) . rhs ;
673- }
674- var caseSwitchLabelSyntax = ! caseInsensitiveStringComparison && correctTypeExpressionSyntax . IsConst && notAlreadyUsed
675- ? ( SwitchLabelSyntax ) SyntaxFactory . CaseSwitchLabel ( csCase )
676- : WrapInCasePatternSwitchLabelSyntax ( node , s . Value , csCase , caseInsensitiveStringComparison ) ;
670+ var wrapForStringComparison = isStringComparison && ( caseInsensitiveStringComparison ||
671+ vbEquality . VbCoerceToNonNullString ( vbExpr , csExprToReuse , switchExprTypeInfo , true , s . Value , originalExpressionSyntax , caseTypeInfo , false ) . rhs != originalExpressionSyntax ) ;
672+
673+ var csExpressionToUse = wrapForStringComparison ? originalExpressionSyntax : correctTypeExpressionSyntax . Expr ;
674+
675+ var caseSwitchLabelSyntax = ! wrapForStringComparison && correctTypeExpressionSyntax . IsConst && notAlreadyUsed
676+ ? ( SwitchLabelSyntax ) SyntaxFactory . CaseSwitchLabel ( csExpressionToUse )
677+ : WrapInCasePatternSwitchLabelSyntax ( node , s . Value , csExpressionToUse , caseInsensitiveStringComparison ) ;
677678 labels . Add ( caseSwitchLabelSyntax ) ;
678679 } else if ( c is VBSyntax . ElseCaseClauseSyntax ) {
679680 labels . Add ( SyntaxFactory . DefaultSwitchLabel ( ) ) ;
@@ -753,13 +754,16 @@ private CasePatternSwitchLabelSyntax WrapInCasePatternSwitchLabelSyntax(VBSyntax
753754 patternMatch = SyntaxFactory . DeclarationPattern (
754755 ValidSyntaxFactory . VarType , SyntaxFactory . SingleVariableDesignation ( varName ) ) ;
755756 ExpressionSyntax csLeft = SyntaxFactory . IdentifierName ( varName ) , csRight = expression ;
756- if ( caseInsensitiveTextComparison ) {
757+ var caseTypeInfo = _semanticModel . GetTypeInfo ( vbCase ) ;
758+ var vbEquality = CommonConversions . VisualBasicEqualityComparison ;
759+ if ( vbEquality . GetObjectEqualityType ( typeInfo , caseTypeInfo ) == VisualBasicEqualityComparison . RequiredType . Object ) {
760+ expression = vbEquality . GetFullExpressionForVbObjectComparison ( csLeft , csRight ) ;
761+ } else {
757762 // We know lhs isn't null, because we always coalesce it in the switch expression
758- ( csLeft , csRight ) = CommonConversions . VisualBasicEqualityComparison
759- . AdjustForVbStringComparison ( node . SelectStatement . Expression , csLeft , typeInfo , true , vbCase , csRight , _semanticModel . GetTypeInfo ( vbCase ) , false ) ;
763+ ( csLeft , csRight ) = vbEquality
764+ . AdjustForVbStringComparison ( node . SelectStatement . Expression , csLeft , typeInfo , true , vbCase , csRight , caseTypeInfo , false ) ;
765+ expression = SyntaxFactory . BinaryExpression ( SyntaxKind . EqualsExpression , csLeft , csRight ) ;
760766 }
761- expression = SyntaxFactory . BinaryExpression ( SyntaxKind . EqualsExpression , csLeft , csRight ) ;
762-
763767 }
764768
765769 var casePatternSwitchLabelSyntax = SyntaxFactory . CasePatternSwitchLabel ( patternMatch ,
0 commit comments