Das mag seltsam erscheinen, aber in C (size_t) (void *) ist 0 == 0 durch die Sprachspezifikation nicht garantiert. Compiler dürfen jeden beliebigen Wert für null verwenden (obwohl sie fast immer 0 verwenden).
In C # können Sie einem Zeiger in unsicheren Code null oder (T *) 0 zuweisen.
MSDN hat dies zu IntPtr.Zero zu sagen:
"Der Wert dieses Feldes entspricht nicht null." Nun, wenn Sie mit C-Code kompatibel sein wollen, macht das sehr viel Sinn - es wäre für Interop wertlos, wenn es nicht in einen C-Null-Zeiger umgewandelt würde. Aber ich möchte wissen, ob IntPtr.Zero.ToInt64 () == 0 was möglich ist, auch wenn intern IntPtr.Zero ein anderer Wert ist (die CLR kann Null in der Cast-Operation konvertieren oder nicht)
Kein Duplikat von diese Frage
Sie könnten das Problem vermeiden:
%Vor% Sie sind also gleich, aber die Verwendung von default
vermeidet das Einbetten beliebiger Annahmen oder hässlicher Umwandlungen in den Code. Der obige Unterschied besteht darin, dass der Unterschied nur signiert / vorzeichenlos ist - beide beginnen mit einer 4-Byte-Konstante ( i4
/ u4
) und werden dann in native-int ( i
/ u
) umgewandelt (die Kommentare //
) sind meine):
In% C ist NULL
als architekturspezifisch definiert. Während die meisten Architekturen 0 verwenden, tun einige nicht. Sie können also nicht annehmen, dass NULL == 0
in C.
Nicht ganz sicher, wie es in C # funktioniert, obwohl ich empfehlen würde, dass Sie sich an die Standardmethode halten, NULL
in C # anzugeben, anstatt sie auf 0 zu setzen.