2012-06-06 8 views
6

Ho appena imparato a memoria che IntPtr.Zero non può essere paragonato al valore predefinito (IntPtr). Qualcuno può dirmi perché?perché non è possibile confrontare IntPtr.Zero e 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

confrontano bene, e sono uguali: 'var IsEqual = == IntPtr.Zero nuovo IntPtr (0);' e IsEqual è vero. – vcsjones

+2

Funziona per me. Su che piattaforma sei e quale versione del framework? – Botz3000

+0

http://ideone.com/BJqvB 'IntPtr.Zero == default (IntPtr)' restituisce true. In quale contesto è questo? –

risposta

2

Lavora per me nel codice compilato in VS 2010, VS 2008, VS 2005 SP1, Mono 1.2.6. Riuscito a riprodurre entrambi i problemi nella finestra di controllo di Visual Studio 2005 solo (ho provato con VS 2005 SP1), il codice compilato funziona come previsto. (Con entrambi i problemi intendo Problema 1: "Impossibile valutare l'espressione", Problema 2: "Il valore Enum era fuori dal range legale".) Quindi, come è stato sottolineato da alcuni autori del commento, si tratta di una finestra di controllo VS 2005 bug su cui ti sei imbattuto. È sorprendentemente difficile trovare rapidamente un collegamento al rapporto bug pertinente ...

Altrimenti in tali casi vorrei iniziare dalla riflessione per vedere quali tipi si tenta di confrontare (sostituire Console.Out con qualsiasi flusso significativo che si ha l'accesso a):

Console.WriteLine("new IntPtr(0) type is: " + new IntPtr(0).GetType()); 
Console.WriteLine("IntPtr.Zero type is: " + IntPtr.Zero.GetType()); 
Problemi correlati