我目前遇到了一个与不安全指针有关的问题,似乎是编译器的bug。
注意:问题并不在于我使用指针和不安全代码;代码运行得很好。问题与已确认的编译器错误有关,在某些情况下拒绝编译合法代码。如果您对该问题感兴趣,请访问我的另一个问题
由于我的问题出在指针变量的声明上,所以我决定绕过这个问题,改用IntPtr
,需要时再转换为实际指针。
然而,我注意到我不能像这样做:
IntPtr a = something;
IntPtr b = somethingElse;
if (a > b) // ERROR. Can't do this
{
}
IntPtr
类型似乎没有定义>
和<
运算符。请注意,我确实可以比较两个实际指针。
IntPtr
有一个.ToInt64()
方法。然而,这返回一个有符号值,在涉及正负值比较时可能返回不正确的值。老实说,我真的不理解为什么要有一个返回有符号值的
.ToInt64()
方法,考虑到指针比较是无符号执行的,但这不是我的问题。有人可能会认为
IntPtr
是不透明的句柄,因此使用>
和<
进行比较是没有意义的。然而,我想指出IntPtr
具有加法和减法方法,这意味着IntPtr
实际上有一个顺序概念,因此>
和<
确实有意义。我想我可以将
ToInt64()
的结果转换为 ulong
然后进行比较,或者将 IntPtr
转换为指针然后进行比较,但是这让我想到为什么 >
和 <
没有定义在 IntPtr
中。
为什么我不能直接比较两个 IntPtr
?
AllocHGlobal
既不返回对象也不返回数组,但我可以在我得到的地址空间内有意义地进行指针比较。 - Panda Pajamamalloc
返回的是什么,因此就语言而言,返回的指针既不是同一对象,也不是(语言)数组。这只是一次超级追究的对话;我们都知道自己在说什么,而且我们表达的完全是同样的意思。 - Panda Pajamamalloc
的行为是由标准定义的,因此它确实如此。语言实现者必须实现标准。我认为你关注的是实现特定的行为,但是实现定义和未定义的行为之间存在差异。我不认为这很迂腐;这些差异很重要。 - Ed S.IntPtr
不能进行排序比较。一个完美的C#IntPtr
带有序和顺序概念,使我可以用<
和>
进行比较,并在跨对象比较时抛出异常。 - Panda Pajama