Ich schreibe Komponententests (MSTest) in C # 6.0, und mir ist aufgefallen, dass der Compiler in der Art und Weise, wie der Compiler die Stringinterpolation in Attributen behandelt, etwas seltsam findet.
Warum funktioniert das?
%Vor%Wenn dies nicht der Fall ist?
%Vor%Ich ignoriere die Tatsache, dass dies keine gute Möglichkeit ist, meine Tests zu kategorisieren. Ich bin neugierig, warum der Compiler das eine und nicht das andere erlaubt.
Wenn der Compiler auf eine interpolierte Zeichenfolge stößt, wird diese sofort in einen Aufruf von String.Format
also ...
Wird ...
%Vor%Attribute erfordern, dass ihre Argumente konstante Ausdrücke sind , aber der obige Ausdruck wird nicht ausgewertet bis zur Ausführungszeit also der Fehler ...
CS0182 Ein Attributargument muss ein konstanter Ausdruck sein, typeof Ausdruck oder Array-Erstellung Ausdruck eines Attributs Parametertyp ...
Sie wissen alle Informationen ist zur Kompilierzeit verfügbar, aber der Compiler ist nicht intelligent genug, um es herauszufinden.
nameof
funktioniert etwas anders als interpolierte Strings, weil ausgewertet wird zur Kompilierungszeit , so dass kein Fehler auftritt.
Ein Attributargument muss eine Kompilierzeitkonstante sein. Während nameof()
eine Konstante ist (siehe Wird nameof () zur Kompilierzeit ausgewertet? ), ist das String-Interpolation-Feature selbst nicht.
Ein interpolierter Zeichenfolgenausdruck erstellt eine Zeichenfolge, indem er die enthaltenen Ausdrücke durch die ToString-Repräsentationen der Ausdrücke 'results' ersetzt.
String-Interpolation findet in Laufzeit statt und Attribute sind in Kompilierzeit . Dein Compiler kann das also nicht lösen, da er wie folgt kompiliert würde:
%Vor%