【问题标题】:How can an UIntPtr object be converted to IntPtr in C#?如何在 C# 中将 UIntPtr 对象转换为 IntPtr?
【发布时间】: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# object casting


    【解决方案1】:

    这应该适用于 x86 和 x64

    IntPtr intPtr = unchecked((IntPtr)(long)(ulong)uintPtr);
    

    【讨论】:

    • 不幸的是,这似乎不适用于 x86。我得到一个溢出异常:UIntPtr uintPtr = new UIntPtr(0xffffffffu); IntPtr intPtr = unchecked((IntPtr)(long)(ulong)uintPtr);
    【解决方案2】:

    这应该适用于 32 位操作系统:

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

    也就是说,将 UIntPtr 转为 uint,将其转为 int,然后将其转为 IntPtr。

    抖动将优化所有转换并简单地将其转换为将一个值直接分配给另一个值的可能性很大,但我还没有实际测试过。

    有关适用于 64 位操作系统的解决方案,请参阅 Jared 的回答。

    【讨论】:

    • 好吧,它会破坏 64 位模式下的指针。使用 long/ulong。
    【解决方案3】:
    UIntPtr _myUIntPtr = /* 一些初始化值。 */ 无效* ptr = _myUIntPtr.ToPointer(); IntPtr _myIntPtr = new IntPtr(ptr);

    【讨论】:

    • UIntPtr x2 = new UIntPtr(x.ToPointer()); 确实有效,但只能在不安全的环境中使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    相关资源
    最近更新 更多