2012-06-06 24 views
6

Tôi vừa học được cách khó mà IntPtr.Zero không thể so sánh với mặc định (IntPtr). Ai đó có thể cho tôi biết tại sao?tại sao không thể so sánh IntPtr.Zero và mặc định (IntPtr)?

IntPtr.Zero == new IntPtr(0) -> "could not evaluate expression" 
IntPtr.Zero == default(IntPtr) --> "could not evaluate expression" 
IntPtr.Zero == (IntPtr)0 -> "could not evaluate expression" 

IntPtr.Zero.Equals(IntPtr.Zero) --> "Enum value was out of legal range" exception 
IntPtr.Zero.Equals(default(IntPtr)) --> "Enum value was out of legal range" exception 

IntPtr.Zero == IntPtr.Zero --> true 
new IntPtr(0) == new IntPtr(0) --> true 
+0

Chúng so sánh tốt và bằng nhau: 'var isEqual = IntPtr.Zero == new IntPtr (0);' và isEqual là đúng. – vcsjones

+2

Làm việc cho tôi. Bạn đang sử dụng nền tảng nào và phiên bản khung công tác nào? – Botz3000

+0

http://ideone.com/BJqvB 'IntPtr.Zero == mặc định (IntPtr)' kết quả đầu ra đúng. Trong bối cảnh này là gì? –

Trả lời

2

Làm việc cho tôi trong mã được biên dịch trong VS 2010, VS 2008, VS 2005 SP1, Mono 1.2.6. Được quản lý để tái tạo cả hai vấn đề trong cửa sổ xem của Visual Studio 2005 chỉ (tôi đã thử với VS 2005 SP1), mã được biên dịch hoạt động như mong đợi. (Cả hai vấn đề tôi có nghĩa là Bài 1: "Không thể đánh giá biểu thức", Bài 2: "Giá trị enum nằm ngoài phạm vi pháp lý".) Như vậy, như được chỉ ra bởi một số tác giả bình luận, đó là cửa sổ xem VS 2005 lỗi mà bạn tình cờ gặp phải. Rất khó để nhanh chóng tìm thấy liên kết đến báo cáo lỗi có liên quan ...

Nếu không, tôi sẽ bắt đầu phản ánh để xem loại bạn cố so sánh (thay thế Console.Out bằng bất kỳ luồng có ý nghĩa nào bạn có quyền truy cập vào):

Console.WriteLine("new IntPtr(0) type is: " + new IntPtr(0).GetType()); 
Console.WriteLine("IntPtr.Zero type is: " + IntPtr.Zero.GetType()); 
Các vấn đề liên quan