@@ -802,8 +802,7 @@ private Expression ParsePrimaryStart()
802
802
return ParseIdentifier ( ) ;
803
803
804
804
case TokenId . StringLiteral :
805
- var expressionOrType = ParseStringLiteral ( false ) ;
806
- return expressionOrType . IsFirst ? expressionOrType . First : ParseTypeAccess ( expressionOrType . Second , false ) ;
805
+ return ParseStringLiteralAsStringExpressionOrTypeExpression ( ) ;
807
806
808
807
case TokenId . IntegerLiteral :
809
808
return ParseIntegerLiteral ( ) ;
@@ -819,6 +818,32 @@ private Expression ParsePrimaryStart()
819
818
}
820
819
}
821
820
821
+ private Expression ParseStringLiteralAsStringExpressionOrTypeExpression ( )
822
+ {
823
+ var clonedTextParser = _textParser . Clone ( ) ;
824
+ clonedTextParser . NextToken ( ) ;
825
+
826
+ // Check if next token is a "(" or a "?(".
827
+ // Used for casting like $"\"System.DateTime\"(Abc)" or $"\"System.DateTime\"?(Abc)".
828
+ // In that case, the string value is NOT forced to stay a string.
829
+ bool forceParseAsString = true ;
830
+ if ( clonedTextParser . CurrentToken . Id == TokenId . OpenParen )
831
+ {
832
+ forceParseAsString = false ;
833
+ }
834
+ else if ( clonedTextParser . CurrentToken . Id == TokenId . Question )
835
+ {
836
+ clonedTextParser . NextToken ( ) ;
837
+ if ( clonedTextParser . CurrentToken . Id == TokenId . OpenParen )
838
+ {
839
+ forceParseAsString = false ;
840
+ }
841
+ }
842
+
843
+ var expressionOrType = ParseStringLiteral ( forceParseAsString ) ;
844
+ return expressionOrType . IsFirst ? expressionOrType . First : ParseTypeAccess ( expressionOrType . Second , false ) ;
845
+ }
846
+
822
847
private AnyOf < Expression , Type > ParseStringLiteral ( bool forceParseAsString )
823
848
{
824
849
_textParser . ValidateToken ( TokenId . StringLiteral ) ;
0 commit comments