2011-09-29 4 views
24

Il mio codice è il seguente:caso Switch in C# - un valore costante è previsto

public static void Output<T>(IEnumerable<T> dataSource) where T : class 
{ 
    dataSourceName = (typeof(T).Name); 
    switch (dataSourceName) 
    { 
     case (string)typeof(CustomerDetails).Name.ToString(); : 
      var t = 123; 
      break; 
     default: 
      Console.WriteLine("Test"); 
    } 
} 

Ma questo non sta funzionando. La dichiarazione del caso mi dà un errore dicendo che è prevista una variabile costante. Per favore, aiutami ragazzi, grazie!

+0

possibile duplicato di [C#: esiste un'alternativa migliore rispetto a "attiva il tipo"?] (Http://stackoverflow.com/questions/298976/c-is-there-a-better-alternative-than -questo-per-attivare-tipo) –

risposta

20

Vedi C# switch statement limitations - why?

dichiarazioni Fondamentalmente commutatori non possono essere valutate in istruzione case. Devono essere valutati staticamente.

+1

Questo non è vero in VB.net ... Sto cercando di convertire un codice che ha già questo tipo di valori del caso (fondamentalmente chiamate di metodi) –

+3

@Moslem Ben Dhaou sì C# Switch non è sicuramente equivalente all'istruzione Case VB. Per le istruzioni Case è possibile utilizzare espressioni (chiamate di funzioni, variabili, ecc.) Mentre C# richiede valori costanti (nessuna chiamata di funzione, variabili, ecc.). L'affermazione dell'interruttore è abbastanza limitata in termini comparabili. – deepee1

19

È possibile associare solo le costanti nelle dichiarazioni di commutazione.

Esempio:

switch (variable) 
{ 
    case 0: 
     //Code 
     break; 
    default: 
     //Code 
     break; 
} 

opere, ma

switch (variable) 
{ 
    case sameothervarialbe: 
     //Code 
     break; 
    default: 
     //Code 
     break; 
} 

non

+11

Come nota aggiuntiva: "const int myConstant = 3" conta come costante, ma "readonly static int myReadonlyStatic = 3" no. – statue

1

interruttore è molto esigente, nel senso che i valori del commutatore deve essere una costante di tempo di compilazione. e anche il valore che viene confrontato deve essere un primitivo (o stringa ora). Per questo dovresti usare una dichiarazione if.

Il motivo può tornare al modo in cui C li gestisce in quanto crea una tabella di salto (poiché i valori sono costanti di tempo di compilazione) e tenta di copiare la stessa semantica non consentendo valori valutati nei casi.

3

Johnnie, passare alla guida di msdn su switch. Inoltre, la specifica linguaggio C# definisce chiaramente la compilazione caso errore di tempo:

• Se il tipo dell'espressione interruttore è sbyte, byte, short, ushort, int, uint, lungo, ulong, bool, char, string, o un tipo enum, o se è il tipo nullable corrispondente a uno di questi tipi, allora questo è il tipo di governo dell'istruzione switch.

• Altrimenti, esattamente un definito dall'utente conversione implicita (§6.4) deve esistere dal tipo dell'espressione interruttore per uno dei seguenti possibili tipi di governo: sbyte, byte, short, ushort, int, uint, long, ulong, char, string, o, un tipo nullable corrispondente a uno dei tipi .

• Altrimenti, se non esiste una conversione implicita o se esiste più di una conversione implicita, si verifica un errore in fase di compilazione.

Spero che questo aiuti.

3

Non è possibile utilizzare un'istruzione switch per questo poiché i valori del caso non possono essere valutati. Per questo è necessario utilizzare un un if/else ...

public static void Output<T>(IEnumerable<T> dataSource) where T : class 
{ 
    dataSourceName = (typeof(T).Name); 
    if(string.Compare(dataSourceName, typeof(CustomerDetails).Name.ToString(), true)==0) 
    { 
     var t = 123; 
    } 
    else if (/*case 2 conditional*/) 
    { 
     //blah 
    } 
    else 
    { 
     //default case 
     Console.WriteLine("Test"); 
    } 
} 

ho anche preso la libertà di mettere in ordine la vostra istruzione condizionale. Non è necessario eseguire il cast alla stringa dopo aver chiamato ToString(). Ciò restituirà sempre una stringa comunque. Quando confronti le stringhe per l'uguaglianza, tieni a mente che l'utilizzo dell'operatore == comporterà un confronto tra maiuscole e minuscole.Meglio usare la stringa compare = 0 con l'ultimo argomento per impostare la distinzione tra maiuscole e minuscole.