Как можно преобразовать объект UIntPtr в IntPtr в C #?

Мне нужно конвертироватьUIntPtr возражать против этого изIntPtr в моем приложении C # .NET 2.0. Как это можно сделать? Я не думаю, что это так просто:

UIntPtr _myUIntPtr = /* Some initializer value. */
object _myObject = (object)_myUIntPtr;
IntPtr _myIntPtr = (IntPtr)_myObject;

Ответы на вопрос(3)

IntPtr intPtr = (IntPtr)(int)(uint)uintPtr;

То есть, превратить UIntPtr в uint, превратить его в int, а затем превратить в IntPtr.

Хорошие шансы, что джиттер оптимизирует все преобразования и просто превратит это в прямое присвоение одного значения другому, но на самом деле я этого не проверял.

См. Ответ Джареда о решении, которое работает в 64-битных операционных системах.

 Hans Passant21 сент. 2010 г., 18:23
Этоне хорошо, он уничтожает указатель в 64-битном режиме. Используйте длинный / длинный.
 Eric Lippert21 сент. 2010 г., 18:54
Отличный момент, спасибо!
 dtb21 сент. 2010 г., 18:22
Это также работает, еслиUIntPtr.Size != 4?
Решение Вопроса

Это должно работать на x86 и x64

IntPtr intPtr = unchecked((IntPtr)(long)(ulong)uintPtr);
 John Hall25 авг. 2016 г., 14:43
К сожалению, это не работает на x86. Я получаю OverflowException с:UIntPtr uintPtr = new UIntPtr(0xffffffffu); IntPtr intPtr = unchecked((IntPtr)(long)(ulong)uintPtr);
UIntPtr _myUIntPtr = /* Some initializer value. */ 
void* ptr = _myUIntPtr.ToPointer();
IntPtr _myIntPtr = new IntPtr(ptr);
 Brian21 сент. 2010 г., 18:48
UIntPtr x2 = new UIntPtr(x.ToPointer()); работает, но только в небезопасном контексте.

Ваш ответ на вопрос