2013-02-19 11 views

risposta

58

Se è nullo, verrà applicata l'etichetta predefinita.

public enum YesNo 
{ 
    Yes, 
    No, 
} 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     YesNo? value = null; 
     switch (value) 
     { 
      case YesNo.Yes: 
       Console.WriteLine("Yes"); 
       break; 
      case YesNo.No: 
       Console.WriteLine("No"); 
       break; 
      default: 
       Console.WriteLine("default"); 
       break; 
     } 
    } 
} 

Il programma stamperà default.

A meno che non venga gestito nulla.

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     YesNo? value = null; 
     switch (value) 
     { 
      case YesNo.Yes: 
       Console.WriteLine("Yes"); 
       break; 
      case YesNo.No: 
       Console.WriteLine("No"); 
       break; 
      case null: 
       Console.WriteLine("NULL"); 
       break; 
      default: 
       Console.WriteLine("default"); 
       break; 
     } 
    } 
} 

stampe NULL.

Se si dispone di un valore di enumerazione non gestita che è stato aggiunto in seguito:

public enum YesNo 
{ 
    Yes, 
    No, 
    FileNotFound, 
} 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     YesNo? value = YesNo.FileNotFound; 
     switch (value) 
     { 
      case YesNo.Yes: 
       Console.WriteLine("Yes"); 
       break; 
      case YesNo.No: 
       Console.WriteLine("No"); 
       break; 
      default: 
       Console.WriteLine("default"); 
       break; 
     } 
    } 
} 

Esso stampa ancora default.

+0

Questo è uno dei motivi per cui mi piace C# più di Java. –

0

È possibile utilizzare l'operatore null-coalescenza ?? per instradare null valori interruttore a un'etichetta caso specifico diverso default:

public static IEnumerable<String> AsStrings(this IEnumerable<Char[]> src) 
{ 
    Char[] rgch; 

    var e = src.GetEnumerator(); 
    while (e.MoveNext()) 
    { 
     switch ((rgch = e.Current)?.Length ?? -1) 
     { 
      case -1: // <-- value when e.Current is 'null' 
       yield return null; 
       break; 
      case 0: 
       yield return String.Empty; 
       break; 
      case 1: 
       yield return String.Intern(new String(rgch[0], 1)); 
       break; 
      default: // 2...n 
       yield return new String(rgch); 
       break; 
     } 
    } 
}