Warum kann ich die String-Interpolation nicht in einem Attribut verwenden?

10

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.

    
Nate Barbettini 05.08.2015, 22:36
quelle

4 Antworten

7

Wenn der Compiler auf eine interpolierte Zeichenfolge stößt, wird diese sofort in einen Aufruf von String.Format also ...

%Vor%

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.

    
Alex Booker 06.08.2015, 08:32
quelle
6

Interpolierte Strings sind keine konstanten Werte. Der Wert wird zur Laufzeit ermittelt, obwohl in Ihrem Fall alle Eingaben zur Kompilierzeit berechnet werden können.

    
Jimmy 05.08.2015 22:41
quelle
3

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.

    
Jeroen Vannevel 05.08.2015 22:42
quelle
0

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%     
Alex H 05.08.2015 22:42
quelle

Tags und Links