2015-08-05 11 views
8

Sto scrivendo unit test (MSTest) in C# 6.0 e ho notato qualcosa di strano nel modo in cui il compilatore gestisce l'interpolazione delle stringhe negli attributi.Perché non posso utilizzare l'interpolazione delle stringhe in un attributo?

Perché fa questo lavoro:

[TestCategory(nameof(MyClass) + "-UnitTest")] 

Quando questo non lo fa?

[TestCategory($"{nameof(MyClass)}-UnitTest")] 

Ignorare il fatto che questo potrebbe non essere un ottimo modo per classificare i miei test; Sono curioso del perché il compilatore consenta l'uno e non l'altro.

+0

Does 'string.Format (" {0} -UnitTest ", nameof (MyClass))' funziona? – Blorgbeard

risposta

6

Quando il compilatore rileva una stringa interpolato converte immediatamente in una chiamata a String.Format così ...

[TestCategory($"{nameof(MyClass)}-UnitTest")] 

Diventa ...

[TestCategory(string.Format("{0}-UnitTest", nameof(MyClass)))] 

Attributes require that their arguments be constant expressions ma l'espressione di cui sopra non essere valutato fino al tempo di esecuzione quindi l'errore ...

CS0182 Un argomento attributo deve essere un'espressione costante, typeof espressione o array creazione espressione di un tipo di parametro di attributo ...

È conoscere tutte le informazioni è disponibili al momento della compilazione, ma il compilatore è non abbastanza intelligente per capirlo.

nameof funziona un po 'in modo diverso rispetto alle stringhe interpolate perché è evaluated at compile-time quindi non ci sono errori.

6

Le stringhe interpolate non sono valori costanti. Il valore viene determinato in fase di esecuzione, anche se nel tuo caso tutti gli input possono essere calcolati in fase di compilazione.

0

L'interpolazione delle stringhe avviene in runtime e gli attributi sono presenti in compile time. Quindi il compilatore cant risolvere questo, come sarebbe essere compilato in questo modo:

argomento
[TestCategory(new FormattableString 
    { 
    Format = "{0}-UnitTest", 
    Args = new object[] { nameof(MyClass)} 
    })] 
3

Un attributo deve essere una costante fase di compilazione. Mentre nameof() è una costante (vedere Is nameof() evaluated at compile-time?), la funzione di interpolazione della stringa non lo è.

Un'espressione di stringa interpolata crea una stringa sostituendo le espressioni contenute con le rappresentazioni ToString dei risultati delle espressioni.

Problemi correlati