2013-02-19 16 views

Odpowiedz

58

Jeśli jest pusta, trafi w domyślną etykietę.

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; 
     } 
    } 
} 

Program wydrukuje default.

O ile nie jest pusta.

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; 
     } 
    } 
} 

wydruki NULL.

Jeśli masz nieobsługiwany wartość enum, który został dodany później:

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; 
     } 
    } 
} 

To wciąż drukuje default.

+0

Jest to jeden z powodów, dla których lubię C# więcej niż Java. –

0

Można użyć operatora null koalescencyjny ?? aby trasa null wartości przełącznika do określonej etykiety przypadku innym niż 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; 
     } 
    } 
}