2017-06-07 18 views
5

Tôi đang xem trang web của Jon skeet trên C# Brain teaser http://www.yoda.arachsys.com/csharp/teasers.html. Tại sao mục "Baz" hiển thị ở đầu ra mặc dù tôi đã tuyên bố các giá trị mặc định cho tất cả các mục trong enumTại sao enums với giá trị mặc định không hoạt động như mong đợi trong C#?

--- ví dụ: 1

class Test 
{ 

    enum Foo { Bar, Baz,bread, jam }; 

    const int One = 1; 
    const int Une = 1; 

    static void Main() 
    { 
     Foo f = 0; 
     Console.WriteLine(f); 
     Console.ReadLine(); 
    } 
} 
// output :Bar 

--eg2

class Test 
{ 
    enum Foo { Bar, Baz,bread=0, jam }; 

    const int One = 1; 
    const int Une = 1; 


    static void Main() 
    { 
     Foo f = 0; 
     Console.WriteLine(f); 
     Console.ReadLine(); 
    } 
} 
//output : Bar 

- eg3

class Test 
{ 
    enum Foo { Bar, Baz=0, bread=0, jam }; 

    const int One = 1; 
    const int Une = 1; 

    static void Main() 
    { 
     Foo f = 0; 
     Console.WriteLine(f); 
     Console.ReadLine(); 
    } 
} 
//output :Baz 

--eg4

class Test 
{ 
    enum Foo { Bar=0, Baz=0, bread=0, jam=0}; 

    const int One = 1; 
    const int Une = 1; 


    static void Main() 
    { 
     Foo f = 0; 
     Console.WriteLine(f); 
     Console.ReadLine(); 
    } 
} 
//output:Baz 
+0

Nếu nhiều thành viên enum có cùng giá trị (0 trong trường hợp này) - bạn mong đợi điều gì cho enum với giá trị đó? – Evk

+0

Nó hoàn nguyên về lựa chọn chữ cái. Baz là trước khi bánh mì –

Trả lời

4

Enums chỉ là số nguyên thành .NET. Bất cứ khi nào bạn nghĩ về chúng như một cái tên (như ToString(), bạn đang thực hiện thực sự là nói "cố gắng tìm nhãn enum được xác định khớp với giá trị số nguyên và cho tôi biết tên đó". Trong trường hợp này, bạn có . nhiều nhãn enum với giá trị số nguyên cùng, vì vậy mà tên trong WriteLine là undefined Lưu ý rằng WriteLine ở đây là cuối cùng làm f.ToString(), áp dụng "tìm một giá trị" logic từ trên

Đối --eg5, tôi sẽ đề nghị:. Foo f = (Foo)-1327861; Hoàn toàn hợp lệ trong các điều khoản .NET, nhưng không khớp với bất kỳ định nghĩa nào là bất kỳ nào.Không cần phải có.

+0

Nếu tôi làm những gì bạn nói (Foo f = (Foo) -1327861).Tôi nhận được lỗi biên dịch "Lỗi \t CS0119 \t 'Test.Foo' là một loại không hợp lệ trong" –

0

Hãy xem xét ví dụ sau:

enum Foo { Bar, Baz,bread=0, jam=0}; 

public static void Main() 
{ 
    Console.WriteLine((int)Foo.Bar); // 0 
    Console.WriteLine((int)Foo.Baz); // 1 
    Console.WriteLine((int)Foo.bread); // 0 
    Console.WriteLine((int)Foo.jam); // 0 
} 

Vì vậy, chúng ta có thể nói rằng nếu chúng ta wont gán bất kỳ giá trị số nguyên vào mục đầu tiên trong enum sẽ được chỉ định với 0 và mục tiếp theo sẽ là previous item value + 1 nếu bạn gán một số giá trị sau đó nó sẽ ghi đè lên các giá trị gia tăng mặc định.

Hãy xem vào this Example

1

Bạn không thể đặt các giá trị mặc định cho enum của bạn thành viên, chỉ cho toàn bộ enum. Giá trị mặc định cho nó là 0, đi đến yếu tố đầu tiên của enum. Các thành viên khác enum nên khác với giá trị đó, nếu không họ chỉ đơn giản là ghi đè lên nó. Trong trường hợp này:

enum Foo { Bar=0, Baz=0, bread=0, jam=0 }; 

Bạn đang nói với trình biên dịch: OK, bây giờ họ 0 sẽ được đặt tên như Bar. Ok, bây giờ 0 sẽ được đặt tên là Baz, v.v. Nó không tạo ra bất kỳ sence cho trình biên dịch.

Trong sách Code Complete, bạn có thể tìm lời khuyên để giới thiệu thành viên enum mặc định có tên là None và chỉ định rõ ràng cho số 0 và đặt nó ở vị trí đầu tiên của enum. Vì vậy, mã của bạn có thể trông giống như sau:

enum Foo 
{ 
    None = 0, 
    Bar, // 1 
    Baz, // 2 
    bread, // 3 
    jam // 4 
}; 
+0

", thanx để trả lời. Nhưng, tại sao chỉ Baz trở lại thay vì bất kỳ vật phẩm nào khác. –

Các vấn đề liên quan