2012-06-06 3 views
6

Я просто усвоил, что IntPtr.Zero не может сравниться с по умолчанию (IntPtr). Может кто-нибудь сказать мне, почему?Почему нельзя сравнивать IntPtr.Zero и default (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

они сравнивают хорошо, и они равны: 'вар IsEqual = IntPtr.Zero == новый IntPtr (0);' и IsEqual верно. – vcsjones

+2

Работает для меня. На какой платформе вы работаете и какая версия фреймворка? – Botz3000

+0

http://ideone.com/BJqvB 'IntPtr.Zero == default (IntPtr)' выводит true. В каком контексте это? –

ответ

2

Работает для меня в скомпилированном коде в VS 2010, VS 2008, VS 2005 SP1, Mono 1.2.6. Управляемый для воспроизведения обеих проблем в окне просмотра Visual Studio 2005 только (я пытался с VS 2005 SP1), скомпилированный код работает, как ожидалось. (По обеим задачам я имею в виду проблему 1: «Не удалось оценить выражение», проблема 2: «Значение Enum было вне допустимого диапазона».) Таким образом, как отмечали некоторые авторы комментариев, это окно VS 2005 ошибка, на которую вы наткнулись. Удивительно сложно быстро найти ссылку на соответствующий отчет об ошибке ...

В противном случае я бы начал с отражения, чтобы посмотреть, какие типы вы пытаетесь сравнить (замените Console.Out любым значимым потоком, который у вас есть доступ к):

Console.WriteLine("new IntPtr(0) type is: " + new IntPtr(0).GetType()); 
Console.WriteLine("IntPtr.Zero type is: " + IntPtr.Zero.GetType()); 
Смежные вопросы