我需要在我的C#.NET 2.0應用程序中將UIntPtr
對象轉換爲IntPtr
的對象。這如何實現?我不認爲它是如此簡單:如何在C#中將UIntPtr對象轉換爲IntPtr?
UIntPtr _myUIntPtr = /* Some initializer value. */
object _myObject = (object)_myUIntPtr;
IntPtr _myIntPtr = (IntPtr)_myObject;
我需要在我的C#.NET 2.0應用程序中將UIntPtr
對象轉換爲IntPtr
的對象。這如何實現?我不認爲它是如此簡單:如何在C#中將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 _myUIntPtr = /* Some initializer value. */ void* ptr = _myUIntPtr.ToPointer(); IntPtr _myIntPtr = new IntPtr(ptr);
'UIntPtr X2 =新UIntPtr(x.ToPointer())工作;'的工作,但僅在不安全的上下文。 – Brian 2010-09-21 16:48:02
這應該在32位操作系統上運行:
IntPtr intPtr = (IntPtr)(int)(uint)uintPtr;
也就是說,轉UIntPtr成UINT,把它轉換成一個int,然後把它變成一個IntPtr。
好處是抖動會優化所有轉換,並簡單地將其轉換爲一個值的直接賦值給另一個值,但我沒有真正測試過。
請參閱Jared的解答,瞭解適用於64位操作系統的解決方案。
如果'UIntPtr.Size!= 4',這也可以嗎? – dtb 2010-09-21 16:22:44
這是* not *好吧,它會以64位模式破壞指針。使用long/ulong。 – 2010-09-21 16:23:45
非常好,謝謝! – 2010-09-21 16:54:56
不幸的是,這似乎不適用於x86。我得到一個OverflowException: 'UIntPtr uintPtr = new UIntPtr(0xffffffffu); ((IntPtr)(long)(ulong)uintPtr);' – 2016-08-25 12:43:19