@@ -417,6 +417,11 @@ private Expression ParseIn()
417417 }
418418 else
419419 {
420+ if ( TypeHelper . TryGetFirstGenericArgument ( right . Type , out var genericRightType ) )
421+ {
422+ TryConvertExpressionToEnum ( genericRightType , ref left , token . Pos ) ;
423+ }
424+
420425 var typeArgs = new [ ] { left . Type } ;
421426 var args = new [ ] { right , left } ;
422427 accumulate = Expression . Call ( typeof ( Enumerable ) , nameof ( Enumerable . Contains ) , typeArgs , args ) ;
@@ -451,20 +456,8 @@ private Expression ProcessInExpressions(Expression left, Dictionary<Expression,
451456 var tokenPos = expressions . ElementAt ( i ) . Value ;
452457
453458 // if the identifier is an Enum (or nullable Enum), try to convert the right-side also to an Enum.
454- if ( TypeHelper . GetNonNullableType ( left . Type ) . GetTypeInfo ( ) . IsEnum )
455- {
456- if ( right is ConstantExpression constantExprRight )
457- {
458- right = ParseEnumToConstantExpression ( tokenPos , left . Type , constantExprRight ) ;
459- }
460- else if ( _expressionHelper . TryUnwrapAsConstantExpression ( right , out var unwrappedConstantExprRight ) )
461- {
462- right = ParseEnumToConstantExpression ( tokenPos , left . Type , unwrappedConstantExprRight ) ;
463- }
464- }
465-
466459 // else, check for direct type match
467- else if ( left . Type != right . Type )
460+ if ( ! TryConvertExpressionToEnum ( left . Type , ref right , tokenPos ) && left . Type != right . Type )
468461 {
469462 CheckAndPromoteOperands ( typeof ( IEqualitySignatures ) , TokenId . DoubleEqual , "==" , ref left , ref right , tokenPos ) ;
470463 }
@@ -502,6 +495,26 @@ private Expression ProcessInExpressions(Expression left, Dictionary<Expression,
502495 return _expressionHelper . GenerateBinaryOrElseTree ( comparisons ) ;
503496 }
504497
498+ private bool TryConvertExpressionToEnum ( Type leftType , ref Expression right , int tokenPos )
499+ {
500+ if ( TypeHelper . GetNonNullableType ( leftType ) . GetTypeInfo ( ) . IsEnum )
501+ {
502+ if ( right is ConstantExpression constantExprRight )
503+ {
504+ right = ParseEnumToConstantExpression ( tokenPos , leftType , constantExprRight ) ;
505+ return true ;
506+ }
507+
508+ if ( _expressionHelper . TryUnwrapAsConstantExpression ( right , out var unwrappedConstantExprRight ) )
509+ {
510+ right = ParseEnumToConstantExpression ( tokenPos , leftType , unwrappedConstantExprRight ) ;
511+ return true ;
512+ }
513+ }
514+
515+ return false ;
516+ }
517+
505518 // &, | bitwise operators
506519 private Expression ParseLogicalAndOrOperator ( )
507520 {
@@ -2000,7 +2013,7 @@ private Expression ParseMemberAccess(Type? type, Expression? expression, string?
20002013
20012014 if ( isApplicableForEnumerable &&
20022015 TypeHelper . TryFindGenericType ( typeof ( IEnumerable < > ) , type , out var enumerableType ) &&
2003- TryParseEnumerable ( expression ! , enumerableType , id , type , out args , out var enumerableExpression ) )
2016+ TryParseEnumerable ( expression ! , enumerableType , id , type , errorPos , out args , out var enumerableExpression ) )
20042017 {
20052018 return enumerableExpression ;
20062019 }
@@ -2262,7 +2275,7 @@ private Expression ParseAsEnumOrNestedClass(string id)
22622275 return ParseMemberAccess ( type , null , identifier ) ;
22632276 }
22642277
2265- private bool TryParseEnumerable ( Expression instance , Type enumerableType , string methodName , Type ? type , out Expression [ ] ? args , [ NotNullWhen ( true ) ] out Expression ? expression )
2278+ private bool TryParseEnumerable ( Expression instance , Type enumerableType , string methodName , Type ? type , int tokenPos , out Expression [ ] ? args , [ NotNullWhen ( true ) ] out Expression ? expression )
22662279 {
22672280 var elementType = enumerableType . GetTypeInfo ( ) . GetGenericTypeArguments ( ) [ 0 ] ;
22682281
@@ -2379,6 +2392,11 @@ private bool TryParseEnumerable(Expression instance, Type enumerableType, string
23792392 {
23802393 if ( new [ ] { "Concat" , "Contains" , "ContainsKey" , "DefaultIfEmpty" , "Except" , "Intersect" , "Skip" , "Take" , "Union" , "SequenceEqual" } . Contains ( methodName ) )
23812394 {
2395+ if ( TypeHelper . TryGetFirstGenericArgument ( instance . Type , out var genericInstanceType ) )
2396+ {
2397+ TryConvertExpressionToEnum ( genericInstanceType , ref args [ 0 ] , tokenPos ) ;
2398+ }
2399+
23822400 if ( args . Length == 1 )
23832401 {
23842402 args = [ instance , args [ 0 ] ] ;
0 commit comments