@@ -770,7 +770,9 @@ public override async Task<SyntaxList<StatementSyntax>> VisitSelectBlock(VBSynta
770770
771771 // CSharp requires an explicit cast from the base type (e.g. int) in most cases switching on an enum
772772 var isBooleanCase = caseTypeInfo . Type ? . SpecialType == SpecialType . System_Boolean ;
773- var csExpressionToUse = IsEnumOrNullableEnum ( switchExprTypeInfo . ConvertedType ) ^ IsEnumOrNullableEnum ( caseTypeInfo . Type ) && ! isBooleanCase ? correctTypeExpressionSyntax . Expr : originalExpressionSyntax ;
773+ bool enumRelated = IsEnumOrNullableEnum ( switchExprTypeInfo . ConvertedType ) || IsEnumOrNullableEnum ( caseTypeInfo . Type ) ;
774+ bool convertingEnum = IsEnumOrNullableEnum ( switchExprTypeInfo . ConvertedType ) ^ IsEnumOrNullableEnum ( caseTypeInfo . Type ) ;
775+ var csExpressionToUse = ! isBooleanCase && ( convertingEnum || ! enumRelated && correctTypeExpressionSyntax . IsConst ) ? correctTypeExpressionSyntax . Expr : originalExpressionSyntax ;
774776
775777 var caseSwitchLabelSyntax = ! wrapForStringComparison && correctTypeExpressionSyntax . IsConst && notAlreadyUsed
776778 ? ( SwitchLabelSyntax ) SyntaxFactory . CaseSwitchLabel ( csExpressionToUse )
@@ -783,14 +785,19 @@ public override async Task<SyntaxList<StatementSyntax>> VisitSelectBlock(VBSynta
783785 var varName = CommonConversions . CsEscapedIdentifier ( GetUniqueVariableNameInScope ( node , "case" ) ) ;
784786 ExpressionSyntax csLeft = ValidSyntaxFactory . IdentifierName ( varName ) ;
785787 var operatorKind = VBasic . VisualBasicExtensions . Kind ( relational ) ;
786- var relationalValue = await relational . Value . AcceptAsync < ExpressionSyntax > ( _expressionVisitor ) ;
787- var binaryExp = SyntaxFactory . BinaryExpression ( operatorKind . ConvertToken ( ) , csLeft , relationalValue ) ;
788+ var csRelationalValue = await relational . Value . AcceptAsync < ExpressionSyntax > ( _expressionVisitor ) ;
789+ csRelationalValue = CommonConversions . TypeConversionAnalyzer . AddExplicitConversion ( relational . Value , csRelationalValue ) ;
790+ var binaryExp = SyntaxFactory . BinaryExpression ( operatorKind . ConvertToken ( ) , csLeft , csRelationalValue ) ;
788791 labels . Add ( VarWhen ( varName , binaryExp ) ) ;
789792 } else if ( c is VBSyntax . RangeCaseClauseSyntax range ) {
790793 var varName = CommonConversions . CsEscapedIdentifier ( GetUniqueVariableNameInScope ( node , "case" ) ) ;
791794 ExpressionSyntax csLeft = ValidSyntaxFactory . IdentifierName ( varName ) ;
792- var lowerBoundCheck = SyntaxFactory . BinaryExpression ( SyntaxKind . LessThanOrEqualExpression , await range . LowerBound . AcceptAsync < ExpressionSyntax > ( _expressionVisitor ) , csLeft ) ;
793- var upperBoundCheck = SyntaxFactory . BinaryExpression ( SyntaxKind . LessThanOrEqualExpression , csLeft , await range . UpperBound . AcceptAsync < ExpressionSyntax > ( _expressionVisitor ) ) ;
795+ var lowerBound = await range . LowerBound . AcceptAsync < ExpressionSyntax > ( _expressionVisitor ) ;
796+ lowerBound = CommonConversions . TypeConversionAnalyzer . AddExplicitConversion ( range . LowerBound , lowerBound ) ;
797+ var lowerBoundCheck = SyntaxFactory . BinaryExpression ( SyntaxKind . LessThanOrEqualExpression , lowerBound , csLeft ) ;
798+ var upperBound = await range . UpperBound . AcceptAsync < ExpressionSyntax > ( _expressionVisitor ) ;
799+ upperBound = CommonConversions . TypeConversionAnalyzer . AddExplicitConversion ( range . UpperBound , upperBound ) ;
800+ var upperBoundCheck = SyntaxFactory . BinaryExpression ( SyntaxKind . LessThanOrEqualExpression , csLeft , upperBound ) ;
794801 var withinBounds = SyntaxFactory . BinaryExpression ( SyntaxKind . LogicalAndExpression , lowerBoundCheck , upperBoundCheck ) ;
795802 labels . Add ( VarWhen ( varName , withinBounds ) ) ;
796803 } else {
0 commit comments