2015-09-04 6 views
20

Mi rendo conto che il modo corretto per gestire i tipi nullable consiste nell'utilizzare la proprietà HasValue. Ma vorrei sapere perché la seguente istruzione switch si interrompe sul caso nullo invece che sul valore predefinito. Utilizzo di VS2015 C# 4.0. Un altro computer che utilizza VS2010 C# 4.0 non ha lo stesso problema.Switch on Nullable Boolean: case passa a null quando il valore è true

private void Testing() 
    { 
     bool? boolValue = true; 

     switch (boolValue) 
     { 
      case null: 
       break; //even though value is true, code runs here 

      default: 
       break; 
     } 
    } 

Edit: comportamento si osserva con qualsiasi Nullable se solo case Null e default è specificato.

+0

Non ho questo comportamento su VS2013 –

+0

Direi che i tuoi simboli non sono aggiornati e che non sta eseguendo quello che pensi sia in esecuzione, o forse il compilatore sta facendo qualche strana cosa di ottimizzazione e combina i due blocchi uguali . Forse aggiungo un po 'di codice vero e vedi cosa fa ... –

+0

Non capisco questo comportamento nel 2010. – thewisegod

risposta

5

Questa non è una risposta, sto solo condividendo il codice IL generato da VS2013 e VS2015.

originale codice C#:

public void Testing() 
{ 
    bool? boolValue = true; 

    switch (boolValue) 
    { 

     case null: 

      Console.WriteLine("null"); 

      break; 

     default: 
      Console.WriteLine("default"); 

      break; 
    } 
} 

VS2013 IL (decompilato):

public void Testing() 
{ 
    bool? boolValue = new bool?(true); 
    bool valueOrDefault = boolValue.GetValueOrDefault(); 
    if (boolValue.HasValue) 
    { 
     Console.WriteLine("default"); 
    } 
    else 
    { 
     Console.WriteLine("null"); 
    } 
} 

VS2015 IL (decompilato):

public void Testing() 
{ 
    bool? flag = new bool?(true); 
    bool? flag2 = flag; 
    bool? flag3 = flag2; 
    if (flag3.HasValue) 
    { 
     bool valueOrDefault = flag3.GetValueOrDefault(); 
    } 
    Console.WriteLine("null"); 
} 
+0

per me c'è solo una variabile 'nullable2'. non flag1,2,3. ma sembra che la parte di default non si compili affatto. il problema è per tutti i tipi nullable –

+0

Forse dipende anche dal decompilatore. Sto usando ILSpy –

+0

Ma perché dovrebbe funzionare per vendettamit in VS2015? – MikeG

13

Ciò sta andando essere una risposta molto breve : Hai appena colpito Roslyn bug #4701, segnalato due settimane fa.

Il traguardo è impostato su 1,1, quindi al momento è necessario aggirare questo problema con una clausola if separata, in attesa del prossimo aggiornamento del compilatore.

Problemi correlati