2014-05-08 21 views
6

Tôi đang làm việc với thư viện bên ngoài có enum. Có một số thành viên của enum này, khi bạn gọi ToString() trên chúng, hãy trả về tên của một thành viên khác của enum.Tại sao Enum.ToString() không trả lại tên enum chính xác?

Console.WriteLine("TOKEN_RIGHT = {0}", Tokens.TOKEN_RIGHT.ToString()); //prints TOKEN_OUTER 
Console.WriteLine("TOKEN_FROM = {0}", Tokens.TOKEN_FROM.ToString()); //prints TOKEN_FROM 
Console.WriteLine("TOKEN_OUTER = {0}", Tokens.TOKEN_OUTER.ToString()); //prints TOKEN_FULL 

Tôi biết rằng khi hai thành viên enum có giá trị bằng số tương tự, bạn có thể nhận được hành vi như thế này, nhưng tôi biết, từ decompilation và kiểm tra các giá trị tại thời gian chạy, mà mỗi thành viên trong enum có giá trị độc nhất.

Dưới đây là một đoạn định nghĩa của enum (tạo ra bởi dotPeek):

public enum Tokens 
{ 

    TOKEN_OR = 134, 
    TOKEN_AND = 135, 
    TOKEN_NOT = 136, 
    TOKEN_DOUBLECOLON = 137, 
    TOKEN_ELSE = 138, 
    TOKEN_WITH = 139, 
    TOKEN_WITH_CHECK = 140, 
    TOKEN_GRANT = 141, 
    TOKEN_CREATE = 142, 
    TOKEN_DENY = 143, 
    TOKEN_DROP = 144, 
    TOKEN_ADD = 145, 
    TOKEN_SET = 146, 
    TOKEN_REVOKE = 147, 
    TOKEN_CROSS = 148, 
    TOKEN_FULL = 149, 
    TOKEN_INNER = 150, 
    TOKEN_OUTER = 151, 
    TOKEN_LEFT = 152, 
    TOKEN_RIGHT = 153, 
    TOKEN_UNION = 154, 
    TOKEN_JOIN = 155, 
    TOKEN_PIVOT = 156, 
    TOKEN_UNPIVOT = 157, 
    TOKEN_FROM = 242, 
} 

Tại sao điều này xảy ra? Có điều gì đó tôi đang làm sai, hoặc đây chỉ là một trong những niềm vui quirks của enums trong .NET? Nếu sau này, là có một workaround cho nó?

(. Đối với những gì nó có giá trị, Tokens là một phần của các Microsoft.SqlServer.Management.SqlParser.Parser namespace trong .NET)

+0

Điều gì sẽ xảy ra nếu bạn đặt điểm ngắt, sau đó đánh giá biểu thức '.ToString' trong cửa sổ ngay lập tức? – Dai

+0

Đó có phải là bản sao chép hoàn chỉnh không? Thêm vào, cuối cùng không nhìn thẳng vào tôi – Paparazzi

+0

@Blam, không có nó không hoàn thành; như đã nói, nó chỉ là một đoạn. – nateirvin

Trả lời

5

Bạn đang xem xét hai các phiên bản khác nhau của hội đồng.

Mã của bạn (tại thiết kế/biên dịch thời gian) đang tham chiếu phiên bản mới hơn (vì bạn có thể sử dụng TOKEN_FROM nhưng khi bạn kiểm tra DLL bằng dotPeek, nó không có ở đó). Tuy nhiên, lắp ráp được tải tại thời gian chạy là phiên bản cũ hơn với các giá trị cơ bản khác nhau do đó không khớp tên.

Bạn sẽ phải điều tra cách bạn đang tham chiếu các tệp DLL không khớp. Nó có thể là khung được cài đặt trên máy thực thi, hoặc có lẽ bạn có các dự án trong cùng một giải pháp tham chiếu các phiên bản khác nhau, hoặc có lẽ một số lý do khác (không thể xác định từ thông tin bạn đã cung cấp).

Khi bạn giải quyết lý do tại sao bạn tham chiếu hai phiên bản khác nhau và hợp nhất nó thành một phiên bản lắp ráp, kết quả Enum.ToString() sẽ giống như bạn mong đợi.

+0

@ user2864740: Điểm tốt; Tôi đã viết lại nó để phản ánh điều đó. –

+1

Như một lưu ý nhanh, với DLL cụ thể này, vấn đề xuất phát từ thực tế là Visual Studio sử dụng DLL đó (cho các dự án cơ sở dữ liệu), nhưng tôi đã tham khảo một phiên bản cũ trong Tài liệu tham khảo của dự án của tôi. – nateirvin

1

Tôi đề nghị thăm dò:

Console.WriteLine("TOKEN_RIGHT = {0}", Tokens.TOKEN_RIGHT.ToString("F")); 

và vân vân

+1

Vui lòng thụt lề mã của bạn để mã được định dạng đúng – rjp

+0

nhờ @RJP, tôi là newbie – pfebolo

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