这可能看起来很奇怪,但在C(size_t)(void *)中,语言规范无法保证0 == 0。允许编译器使用他们想要的任何值为null(尽管它们几乎总是使用0。)
在C#中,您可以为不安全代码中的指针指定null或(T *)0。
“此字段的值不等于null。”好吧,如果你想与C代码兼容,这很有意义 - 如果没有转换为C空指针,它对于互操作是没有价值的。但是我想知道IntPtr.Zero.ToInt64()== 0这是否可能,即使内部IntPtr.Zero是其他一些值(在转换操作中CLR可能会也可能不会将null转换为0)
的副本答案 0 :(得分:5)
你可以避免这个问题:
char* foo = (char*)(void*)0;
char* bar = default(char*); // <======= the one to look at
Console.WriteLine(foo == bar); // writes True
所以它们是相同的,但是使用default
避免了必须在代码中嵌入任何假设或讨厌的强制转换。反汇编以上内容,唯一的区别是有符号/无符号 - 都以4字节常量(i4
/ u4
开头)然后强制转换为native-int(i
/ {{1} }(u
评论是我的):
//
答案 1 :(得分:0)
在C中,NULL
被定义为特定于体系结构。虽然大多数架构使用0,但有些架构不使用。所以,你不能假设C. {/ p>中的NULL == 0
不太确定它在C#中是如何工作的,但我建议您坚持使用在C#中指定NULL
的标准方式,而不是将其强制转换为0。