@@ -313,9 +313,16 @@ private Expression ParseIn()
313313 Expression right = ParseUnary ( ) ;
314314
315315 // if the identifier is an Enum, try to convert the right-side also to an Enum.
316- if ( left . Type . GetTypeInfo ( ) . IsEnum && right is ConstantExpression constantExpression )
316+ if ( left . Type . GetTypeInfo ( ) . IsEnum )
317317 {
318- right = ParseEnumToConstantExpression ( op . Pos , left . Type , constantExpression ) ;
318+ if ( right is ConstantExpression constantExprRight )
319+ {
320+ right = ParseEnumToConstantExpression ( op . Pos , left . Type , constantExprRight ) ;
321+ }
322+ else if ( _expressionHelper . TryUnwrapAsConstantExpression ( right , out var unwrappedConstantExprRight ) )
323+ {
324+ right = ParseEnumToConstantExpression ( op . Pos , left . Type , unwrappedConstantExprRight ) ;
325+ }
319326 }
320327
321328 // else, check for direct type match
@@ -476,13 +483,27 @@ private Expression ParseComparisonOperator()
476483 {
477484 left = e ;
478485 }
479- else if ( TypeHelper . IsEnumType ( left . Type ) && ( constantExpr = right as ConstantExpression ) != null )
486+ else if ( TypeHelper . IsEnumType ( left . Type ) )
480487 {
481- right = ParseEnumToConstantExpression ( op . Pos , left . Type , constantExpr ) ;
488+ if ( right is ConstantExpression constantExprRight )
489+ {
490+ right = ParseEnumToConstantExpression ( op . Pos , left . Type , constantExprRight ) ;
491+ }
492+ else if ( _expressionHelper . TryUnwrapAsConstantExpression ( right , out var unwrappedConstantExprRight ) )
493+ {
494+ right = ParseEnumToConstantExpression ( op . Pos , left . Type , unwrappedConstantExprRight ) ;
495+ }
482496 }
483- else if ( TypeHelper . IsEnumType ( right . Type ) && ( constantExpr = left as ConstantExpression ) != null )
497+ else if ( TypeHelper . IsEnumType ( right . Type ) )
484498 {
485- left = ParseEnumToConstantExpression ( op . Pos , right . Type , constantExpr ) ;
499+ if ( left is ConstantExpression constantExprLeft )
500+ {
501+ left = ParseEnumToConstantExpression ( op . Pos , right . Type , constantExprLeft ) ;
502+ }
503+ else if ( _expressionHelper . TryUnwrapAsConstantExpression ( left , out var unwrappedConstantExprLeft ) )
504+ {
505+ left = ParseEnumToConstantExpression ( op . Pos , right . Type , unwrappedConstantExprLeft ) ;
506+ }
486507 }
487508 else
488509 {
@@ -498,11 +519,11 @@ private Expression ParseComparisonOperator()
498519 {
499520 left = Expression . Constant ( typeConverter . ConvertFromInvariantString ( stringValueL ) , right . Type ) ;
500521 }
501- else if ( _expressionHelper . TryUnwrapConstantExpression < string > ( right , out var unwrappedStringValueR ) && ( typeConverter = _typeConverterFactory . GetConverter ( left . Type ) ) != null && typeConverter . CanConvertFrom ( right . Type ) )
522+ else if ( _expressionHelper . TryUnwrapAsValue < string > ( right , out var unwrappedStringValueR ) && ( typeConverter = _typeConverterFactory . GetConverter ( left . Type ) ) != null && typeConverter . CanConvertFrom ( right . Type ) )
502523 {
503524 right = Expression . Constant ( typeConverter . ConvertFromInvariantString ( unwrappedStringValueR ) , left . Type ) ;
504525 }
505- else if ( _expressionHelper . TryUnwrapConstantExpression < string > ( left , out var unwrappedStringValueL ) && ( typeConverter = _typeConverterFactory . GetConverter ( right . Type ) ) != null && typeConverter . CanConvertFrom ( left . Type ) )
526+ else if ( _expressionHelper . TryUnwrapAsValue < string > ( left , out var unwrappedStringValueL ) && ( typeConverter = _typeConverterFactory . GetConverter ( right . Type ) ) != null && typeConverter . CanConvertFrom ( left . Type ) )
506527 {
507528 left = Expression . Constant ( typeConverter . ConvertFromInvariantString ( unwrappedStringValueL ) , right . Type ) ;
508529 }
@@ -581,7 +602,7 @@ private Expression ParseComparisonOperator()
581602 return left ;
582603 }
583604
584- private bool HasImplicitConversion ( Type baseType , Type targetType )
605+ private static bool HasImplicitConversion ( Type baseType , Type targetType )
585606 {
586607 var baseTypeHasConversion = baseType . GetMethods ( BindingFlags . Public | BindingFlags . Static )
587608 . Where ( mi => mi . Name == "op_Implicit" && mi . ReturnType == targetType )
@@ -597,12 +618,12 @@ private bool HasImplicitConversion(Type baseType, Type targetType)
597618 . Any ( mi => mi . GetParameters ( ) . FirstOrDefault ( ) ? . ParameterType == baseType ) ;
598619 }
599620
600- private ConstantExpression ParseEnumToConstantExpression ( int pos , Type leftType , ConstantExpression constantExpr )
621+ private static ConstantExpression ParseEnumToConstantExpression ( int pos , Type leftType , ConstantExpression constantExpr )
601622 {
602623 return Expression . Constant ( ParseConstantExpressionToEnum ( pos , leftType , constantExpr ) , leftType ) ;
603624 }
604625
605- private object ParseConstantExpressionToEnum ( int pos , Type leftType , ConstantExpression constantExpr )
626+ private static object ParseConstantExpressionToEnum ( int pos , Type leftType , ConstantExpression constantExpr )
606627 {
607628 try
608629 {
@@ -618,7 +639,7 @@ private object ParseConstantExpressionToEnum(int pos, Type leftType, ConstantExp
618639
619640 try
620641 {
621- return Enum . ToObject ( TypeHelper . GetNonNullableType ( leftType ) , constantExpr . Value ) ;
642+ return Enum . ToObject ( TypeHelper . GetNonNullableType ( leftType ) , constantExpr . Value ! ) ;
622643 }
623644 catch
624645 {
0 commit comments