2011-12-23 36 views
6

Tôi gặp rắc rối với enums trong C#Tại sao C# enums của tôi không hoạt động?

Tôi có một enum ở đây:

namespace Project.Shared 
{ 
    public enum CostType 
    { 
     Dollars, 
     Percent 
    } 
} 

tôi có một đối tượng đang cố gắng sử dụng enum ở đây:

using Project.Shared; 
namespace Project.Shared.FooNamespace 
{ 
    public class Foo 
    { 
     public int CostType { get; set; } 

     public Foo() 
     { 

      CostType = (int)CostType.Dollars; // <--- error syntax highlighting on 'Dollars' 
     } 
    } 
} 

Điều này dẫn đến một lỗi:

'int' does not contain a definition for 'Dollars' and no extension method 'Dollars' accepting a first argument of type 'int' could be found (are you missing a using directive or an assembly reference?)

Tôi không hiểu tại sao tôi không thể sử dụng m y enum ở đó. Ai đó có thể giúp giải thích cho tôi?

+6

Đây có thể là gợi ý rằng bạn không nên sử dụng cùng tên cho enum như đối với thuộc tính. –

+1

Tại sao bạn muốn lưu trữ giá trị dưới dạng int nếu bạn có enum và bạn muốn giá trị enum? – WestDiscGolf

+0

Vì EntityFramework không hỗ trợ ánh xạ tới Enums. – quakkels

Trả lời

16

Vì lớp học của bạn Foo có định nghĩa này - public int CostType { get; set; } - có phạm vi địa phương nhiều hơn số enum của bạn.

Cố gắng hoàn toàn đủ điều kiện nó với không gian tên của nó:

CostType = (int)Project.Shared.CostType.Dollars; 
+1

Ngoài ra, tôi sẽ làm 'this.CostType =' để trợ giúp với sự mơ hồ của 'CostType'. –

+0

@ErikPhilips +1 Tôi với ya. Rất nhiều người dường như * khinh thường * nhìn thấy vòng loại 'này' trong mã mặc dù ... – Yuck

+1

Cảm ơn sự giúp đỡ ... điều này giải quyết nó. Giáng sinh vui vẻ – quakkels

1

Bạn đã đặt tên cho cuộc xung đột. Bạn đã đặt tên cho bạn là CostType giống với tên enum. Theo cách này, C# giả định rằng cả hai tham chiếu CostType trong phương thức Foo() đều tham chiếu đến thuộc tính và không phải là enum.

Bạn có thể thử này:

CostType = (int)Project.Shared.CostType.Dollars; 
1

Vấn đề là ở CostType = (int)CostType.Dollars; Cả hai lần xuất hiện của CostType tham khảo các biến. Và biến số CostType không có thuộc tính nào được gọi là Dollars. Bao gồm không gian tên để tham chiếu đến loại Project.Shared.CostType để chỉ rõ loại, chứ không phải biến.

1

Thay đổi nó để này và nó sẽ làm việc

public enum CostType 
{ 
    Dollars, 
    Percent 
} 

public class Foo 
{   
    public int CostTypes { get; set; } 
    public Foo() 
    { 
     CostTypes = (int)CostType.Dollars; 
     // <--- error syntax highlighting on 'Dollars' 
    } 
} 

tôi sẽ không đặt tên sở hữu ô tô của tôi tên giống như CostType enum của tôi, tôi đã thử nghiệm này và những gì tôi đã đăng tải đã biên dịch và làm việc

+3

đặt tên thuộc tính này 'CostTypes' không có ý nghĩa. Nó không phải là một cờ enum, và do đó chỉ có thể đại diện cho một 'CostType' duy nhất. Vậy tại sao bạn sử dụng số nhiều? – CodesInChaos

+0

Tôi đã xem câu hỏi của anh ấy là có vấn đề về truy cập hoặc biên dịch vấn đề nếu trường hợp đó xảy ra thì anh ấy nên có không gian tên hoặc đủ điều kiện để họ khớp với – MethodMan

+0

@DJ KRAZE - Câu trả lời của mỗi Yuck Giờ đây tôi đủ điều kiện với tên – quakkels

12

Như những người khác đã chỉ ra, tài sản là "gần hơn" so với loại, và vì vậy khi tên đơn giản được giải quyết, tài sản luôn luôn thắng.

Một nếp nhăn thú vị về tình huống này mặc dù là nếu bạn đã tạo thuộc tính kiểu CostType thay vì int, nó sẽ hoạt động.

Lý do là vì C# có quy tắc đặc biệt chỉ dành cho tình huống đó, thường được gọi là quy tắc "Màu màu". (Vì đó là tình huống phổ biến nhất: loại có tên Màu và thuộc tính được gọi là Màu thuộc loại Màu.)

Nếu tên đơn giản có thể có nghĩa là loại một thuộc tính hoặc trường name, thuộc loại, sau đó C# cho phép bạn truy cập cả hai thành viên tĩnh qua các thành viên loại thông qua thuộc tính.Điều này cho phép bạn thực hiện những việc như:

Color = Color.Red; 
description = Color.ToString(); 

Màu đầu tiên và thứ ba là tham chiếu đến thuộc tính; thứ hai là tham chiếu đến loại.

+1

+1 cho một cái gì đó mới học được ngày hôm nay –

+0

+1 Rất thú vị, cũng không biết điều đó. – Yuck

0

Tôi đã giải quyết: 'ENUM không chứa định nghĩa cho lỗi VALUE', bằng cách khởi động lại Visual Studio. Chỉ trong trường hợp bất cứ ai có cùng một vấn đề.

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