これは奇妙に思えるかもしれませんが、C では (size_t)(void*)0 == 0 は言語仕様によって保証されていません。コンパイラは、null に任意の値を使用できます (ほとんどの場合、0 を使用しますが)。
C# では、アンセーフ コードで null または (T*)0 をポインターに割り当てることができます。
- 違いはありますか?
- (long)(void*)0 == 0 (保証されているかどうか? 別の言い方をすると: IntPtr.Zero.ToInt64() == 0)
MSDN は、IntPtr.Zero について次のように述べています。
「このフィールドの値はヌルと同等ではありません。」C コードとの互換性を維持したい場合、それは非常に理にかなっています。C ヌル ポインターに変換されなければ、相互運用性には意味がありません。しかし、IntPtr.Zero.ToInt64() == 0 が内部的に IntPtr.Zero である場合でも、可能な場合があるかどうかを知りたいです (CLR は、キャスト操作で null を 0 に変換する場合としない場合があります)。
この質問の複製ではありません