2012-07-03 34 views
8

tôi có ba enums:Giá trị của enum như là kết quả của một hàm

enum ValueType : int 
{ 
    FloatingPoint = 2, 
    .../... 
} 
enum ConstraintType : int 
{ 
    Range = 2, 
    .../... 
} 
enum Parameter : int 
{ 
    ExposureTime = F(ValueType.FloatingPoint, ConstraintType.Range, 23), 
    .../... 
} 

Vấn đề là ở chữ ký của F nếu tôi sử dụng:

private static int F(ValueType _V, ConstraintType _C, int _N) { ... } 

tôi nhận được một lỗi (arguments không hợp lệ) cho mọi cuộc gọi theo định nghĩa của Parameter, nhưng nếu tôi sử dụng các mục sau đây thay thế:

private static int F(int _V, int _C, int _N) { ... } 

Mọi thứ đều ổn.

Đó không phải là vấn đề chặn, nhưng tôi muốn hiểu tại sao lại như vậy.

+2

bạn gọi F như thế nào? Bạn có truyền ints hay enums như params? – kristian

+0

@kristian: Điều đó được nêu trong câu hỏi :-) Xem khối mã đầu tiên. (Tôi cũng không thấy nó lúc đầu.) –

+0

@ O.R.Mapper làm thế nào mà lẻn vào đó ?! ;) – kristian

Trả lời

9

C bang # đặc tả trong phần 14,3 ("thành viên Enum") mà

Within an enum member initializer, values of other enum members are always treated as having the type of their underlying type, so that casts are not necessary when referring to other enum members.

Theo như tôi có thể nói đây là lý do tại sao những lập luận dường như có một loại int. Thật thú vị khi lưu ý rằng điều này sẽ không gây ra một lỗi lập luận hợp lệ:

ExposureTime = F((ValueType)ValueType.FloatingPoint, 
       (CostraintType)ConstraintType.Range, 
       23), 

Tất nhiên nó vẫn sẽ dẫn đến khác lỗi bởi vì bạn không thể sử dụng một phương pháp gọi để khởi tạo các thành viên enum như Marc nói. Cuộc gọi phương thức không phải là biểu thức liên tục, trong khi

The associated value of an enum member is assigned either implicitly or explicitly. If the declaration of the enum member has a constant-expression initializer, the value of that constant expression, implicitly converted to the underlying type of the enum, is the associated value of the enum member. If the declaration of the enum member has no initializer, its associated value is set implicitly [...]

+0

Quan sát thông số tuyệt vời –

7

Đối với các enums có giá trị rõ ràng, giá trị phải là biểu thức không đổi. F(...)không phải một biểu thức liên tục. Bất kể tham số là int hoặc enums, bạn không thể chỉ định một giá trị enum từ một cuộc gọi hàm.

của bạn "mọi thứ đều tốt" thực sự có nghĩa là:

The expression being assigned to 'blah.Parameter.ExposureTime' must be constant

duy nhất "vấn đề" ở đây là trình biên dịch không đưa ra một thông báo lỗi rất thanh lịch với một kịch bản bất hợp pháp nói riêng.

+0

Trên thực tế trình biên dịch không cung cấp thông báo lỗi dự kiến ​​nếu chữ ký phương thức được sửa đổi để chấp nhận int. – Jon

+0

Ok Tôi đã bỏ lỡ điều đó ... – gregseth

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