2013-02-19 19 views
41

Nhãn mặc định của câu lệnh switch của C# xử lý một enum vô hiệu như thế nào?Nhãn mặc định của câu lệnh switch của C# sẽ xử lý một enum vô hiệu như thế nào?

Nhãn mặc định có thu được các giá trị rỗng và bất kỳ trường hợp chưa được xử lý nào không?

+2

Hãy thử nó ở đây: http://ideone.com/ – CloudyMarble

+3

C# Language Specification, 8.7.2 "Câu lệnh chuyển đổi". http://msdn.microsoft.com/en-us/library/ms228593.aspx – Dennis

Trả lời

58

Nếu nó rỗng, nó sẽ nhấn nhãn mặc định.

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

Chương trình sẽ in default.

Trừ khi xử lý null.

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

in NULL.

Nếu bạn có một giá trị enum unhandled đã được thêm vào sau đó:

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

Nó vẫn in default.

+0

Đây là một trong những lý do tại sao tôi thích C# hơn Java. –

0

Bạn có thể sử dụng toán tử null-coalescing ?? để định tuyến null giá trị chuyển sang một nhãn trường hợp cụ thể khác hơn 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; 
     } 
    } 
}