2013-02-19 39 views

回答

58

如果它爲空,它將會打到默認標籤。

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

該程序將打印default

除非空值被處理。

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

打印NULL

如果您有以後增加了未處理的枚舉值:

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

它仍然打印default

+0

這是我喜歡C#而不是Java的原因之一。 – 2016-08-11 07:30:15

0

您可以使用空合併運算??路由null開關值以外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; 
     } 
    } 
}