The order of evaluation is guaranteed left-to-right per the C# 6.0 Specification on Interpolated Strings.
This is because the algorithm of construction is specified. The relevant parts:
In both cases, the argument list of the call consists of a format string literal with placeholders for each interpolation, and an argument for each expression corresponding to the place holders ..
The format string literal is constructed as follows, where N is the number of interpolations in the interpolated_string_expression: ..
.. for each number n from 0 to N-1 [the format string "{n:..}" is added] ..
As the format sequence is guaranteed to use ordered [0,N) positional placeholders, then so too is the ordering of each "corresponding argument", and evaluation of, that is supplied to the string.Format
call.
Thus the output of $@"A{cc++}B{--cc}C{++cc}"
is guaranteed to be generated in a manner equivalent to string.Format("A{0}B{1}C{2}", c++, --c, ++c)
, where the order of the argument evaluation of F(..)
is left-to-right.
The compiler could also generate equivalent code similar to string.Concat("A", c++, "B", --c, "C", ++c)
, which has a trivially equivalent evaluation order given the ordering guarantee of the core format specifier.
(The actual generated calls are different, see the conversions in the documentation; however, the examples above illustrate the evaluation ordering.)