2015-09-29 8 views
5

Se String.Empty è valido come "", allora come mai il compilatore si presenta con una stringa. Mancanza nell'istruzione case? Niente può essere più costante di string.Empty a mio avviso. Qualcuno sa? Grazie!String.Empty in Switch/case statement genera un errore del compilatore

switch (filter) 
      { 
    case string.Empty: // Compiler error "A constant value is expected" 

       break; 

       case "": // It's Okay. 
        break; 

      } 
+0

dare uno sguardo qui: http://stackoverflow.com/questions/2701314/cannot-use-string-empty-as-a-default -valore-per-un-parametro-facoltativo – blfuentes

+0

@blacai Grazie! E 'stata una buona lettura! – Zuzlx

risposta

6

Si può provare in questo modo invece:

switch(filter ?? String.Empty) 

string.Empty è un campo di sola lettura, mentre "" è una costante fase di compilazione. Si può anche passare attraverso un articolo qui su Codice progetto String.Empty Internals

//The Empty constant holds the empty string value. 
//We need to call the String constructor so that the compiler doesn't 
//mark this as a literal. 
//Marking this as a literal would mean that it doesn't show up as a field 
//which we can access from native. 

public static readonly String Empty = ""; 

Su un lato nota:

Si vedrà anche questo problema quando si sta fornendo il valore del parametro di default all'interno del vostro metodo (C# 4.0):

void myMethod(string filter = string.Empty){} 

Quanto sopra comporterà un errore di compilazione in quanto il valore predefinito deve essere una costante.

+0

Grazie Rahul. Ma mi stavo chiedendo come mai non possiamo usare string.Empty. È piuttosto strano per me. – Zuzlx

+0

@Zuzlx: - Per quanto ne so, "String.Empty" è un campo di sola lettura mentre "" "è una costante di tempo di compilazione. –

+0

Ha senso. Grazie ancora. Possiamo scoprire che c'è acqua su Marte, ma jolly non possiamo usare il test 'string.Empty' per '" "" Triste stato di cose – Zuzlx

3

Motivo

Non è possibile utilizzare readonly valori in caso; si consideri il seguente scenario:

public string MyProperty { get; } // is a read only property of my class 
    switch (filter) 
    { 
     case MyProperty: // wont compile this since it is read only 
     break; 
      // rest of statements in Switch 
    } 

Come hai detto string.Empty è equivalente a "", qui posso dimostrare questo con lo stesso esempio di switch:

string filter = string.Empty; 
switch (filter) 
    { 
     case "": // It's Okay. 
     break; 
     //rest of statements in Switch 
    } 

Poi L'unica ragione per non permetterà string.Empty nel caso sia. è sola lettura, switch abitudine consente di leggere solo i valori nel suo caso