Jon è naturalmente del tutto corretto che un enum può avere qualsiasi valore del suo sottostante digita, quindi lo switch non è esaustivo e pertanto esiste un percorso di codice che non restituisce. Tuttavia,, non è un'analisi completa del problema. Anche se il parametro fosse esaustivo, avresti comunque ricevuto l'errore.
Provalo:
int M(bool b)
{
switch(b)
{
case true : return 123;
case false: return 456;
}
}
O
int M(byte b)
{
switch(b)
{
case 0: case 1: case 2: ... all of them ... case 255: return 123;
}
}
In entrambi i casi, si otterrà lo stesso "punto raggiungibile fine a se il metodo non-vuoto" errore.
Questa è semplicemente una svista nella sezione "Verifica di raggiungibilità" della specifica C#. Definiamo il punto finale di un'istruzione switch come raggiungibile se non ha una sezione predefinita, punto. Non esiste una dispensa speciale per gli interruttori che consumano in modo esaustivo ogni possibile valore del loro input. È un caso d'angolo che i designer di lingue hanno mancato, e non è mai stato abbastanza prioritario per risolverlo.
Per gli altri tre numeri interessanti di analisi delle istruzioni switch, vedere:
http://ericlippert.com/2009/08/13/four-switch-oddities/
fonte
2010-09-02 14:41:33
Poiché il metodo è privata e quindi il chiamante deve essere di passaggio solo roba buona (perché l'autore del chiamante è * voi *, non i tuoi utenti) Suggerisco un Debug.Fail ("Bad caller! No biscuit!") o simili nel caso predefinito. –
@Eric: Forse ...tranne per il fatto che devi ancora restituire qualcosa o lanciare anche un'eccezione * per soddisfare i requisiti di raggiungibilità. Personalmente non sono mai stato un grande fan di 'Debug. *' - Tendo a piacere vedere le stesse eccezioni in modalità di rilascio come modalità di debug, ma potrebbe essere solo io. –