gpt4 book ai didi

c# - IntPtr 允许从 ulong 到 long 的隐式转换

转载 作者:太空狗 更新时间:2023-10-29 20:27:54 25 4
gpt4 key购买 nike

class A
{
public static explicit operator A(long mm)
{
return null;
}
}
UInt64 ul = UInt64.MaxValue;
IntPtr ptr = (IntPtr)ul;//no error
A a = (A)ul;//Cannot convert type 'ulong' to 'A'

为什么 IntPtr 允许这种行为?

IL 代码如下:

.entrypoint
.maxstack 1
.locals init (
[0] uint64 ul,
[1] native int ptr)
L_0000: nop
L_0001: ldc.i4.m1
L_0002: conv.i8
L_0003: stloc.0
L_0004: ldloc.0
L_0005: call native int [mscorlib]System.IntPtr::op_Explicit(int64)
L_000a: stloc.1
L_000b: ret

最佳答案

我同意这看起来有点奇怪,所以我进行了几次测试。

测试 #1:转换 ulong 和 long

ulong ul = UInt64.MaxValue;
long l = Int64.MaxValue;
IntPtr ulptr = (IntPtr)ul;
IntPtr lptr = (IntPtr)l;

因为 IntPtr 强制转换声明它可能会抛出 OverflowException,所以我期待 (IntPtr)ul 强制转换抛出异常。它没有。想象一下当 (IntPtr)l 转换抛出 OverflowException 时我的惊讶。对此,我看到我的项目被设置为针对 x86 进行编译,所以异常现在有意义了——Int64.MaxValue 太大而无法放入 32-位 IntPtr

测试 #2:在同一代码周围放置一个 checked block 。

现在,我真的希望 (IntPtr)ul 强制转换抛出异常,它确实抛出了异常。

这让我想知道第一个类型转换发生了什么。在未经检查的代码上使用 ildasm 会导致以下结果:

IL_0000:  nop
IL_0001: ldc.i4.m1
IL_0002: conv.i8
IL_0003: stloc.0
IL_0004: ldc.i8 0x7fffffffffffffff
IL_000d: stloc.1
IL_000e: ldloc.0
IL_000f: call native int [mscorlib]System.IntPtr::op_Explicit(int64)
IL_0014: stloc.2
IL_0015: ldloc.1
IL_0016: call native int [mscorlib]System.IntPtr::op_Explicit(int64)

因此 -1 被放入堆栈并转换为 int64,但是没有从无符号到有符号 int64 的额外转换。

checked 版本略有不同:

IL_0000:  nop
IL_0001: nop
IL_0002: ldc.i4.m1
IL_0003: conv.i8
IL_0004: stloc.0
IL_0005: ldc.i8 0x7fffffffffffffff
IL_000e: stloc.1
IL_000f: ldloc.0
IL_0010: conv.ovf.i8.un
IL_0011: call native int [mscorlib]System.IntPtr::op_Explicit(int64)
IL_0016: stloc.2
IL_0017: ldloc.1
IL_0018: call native int [mscorlib]System.IntPtr::op_Explicit(int64)

现在有一个从 unsigned 到 signed 的转换,这是在溢出的情况下所必需的。

不幸的是,这并没有回答最初的问题。

更新:我删除了不正确的答案部分,因此没有留下任何实际答案。但是,我希望它有帮助,所以我没有删除整个答案。

关于c# - IntPtr 允许从 ulong 到 long 的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15768294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com