【发布时间】:2010-09-21 15:57:34
【问题描述】:
我需要在我的 C# .NET 2.0 应用程序中将 UIntPtr 对象转换为 IntPtr 的对象。如何实现?我不认为它这么简单:
UIntPtr _myUIntPtr = /* Some initializer value. */
object _myObject = (object)_myUIntPtr;
IntPtr _myIntPtr = (IntPtr)_myObject;
【问题讨论】:
我需要在我的 C# .NET 2.0 应用程序中将 UIntPtr 对象转换为 IntPtr 的对象。如何实现?我不认为它这么简单:
UIntPtr _myUIntPtr = /* Some initializer value. */
object _myObject = (object)_myUIntPtr;
IntPtr _myIntPtr = (IntPtr)_myObject;
【问题讨论】:
这应该适用于 x86 和 x64
IntPtr intPtr = unchecked((IntPtr)(long)(ulong)uintPtr);
【讨论】:
UIntPtr uintPtr = new UIntPtr(0xffffffffu); IntPtr intPtr = unchecked((IntPtr)(long)(ulong)uintPtr);
这应该适用于 32 位操作系统:
IntPtr intPtr = (IntPtr)(int)(uint)uintPtr;
也就是说,将 UIntPtr 转为 uint,将其转为 int,然后将其转为 IntPtr。
抖动将优化所有转换并简单地将其转换为将一个值直接分配给另一个值的可能性很大,但我还没有实际测试过。
有关适用于 64 位操作系统的解决方案,请参阅 Jared 的回答。
【讨论】:
【讨论】:
UIntPtr x2 = new UIntPtr(x.ToPointer()); 确实有效,但只能在不安全的环境中使用。