以下代码运行时没有错误,但结果是错误的(它给出了8)。为什么不抛出编译时/运行时错误?如果它没有抛出错误的计算方式v.a+v.b
?
[StructLayout(LayoutKind.Explicit)]
internal struct SomeValType
{
[FieldOffset(0)]
public int a; // The a and b fields overlap each
[FieldOffset(0)]
public int b;
}
class Program
{
static void Main(string[] args)
{
SomeValType v = new SomeValType();
v.a = 2;
v.b = 4;
Console.WriteLine(v.a + v.b);
Console.ReadLine();
}
}
答案 0 :(得分:1)
简短回答:该计划以通常的方式计算v.a + v.b
。
长答案: v.a
和v.b
位于相同的内存位置(它们的地址相同)。将值分配给v.a
会导致将相同的值分配给v.b
,而反之亦然。
因此,v.a = 2
为2
和v.a
分配v.b
,后续v.b = 4
为4
分配v.b
}和v.a
。
从那里,v.a + v.b
会产生4 + 4
,这会产生8
。
没有编译时错误,因为代码执行的操作完全合法。您已明确指定两个字段必须位于相同的内存位置,因此编译器必须执行此操作。它无法确定最终的行为不是您想要的行为。
答案 1 :(得分:0)
我意识到,当两个字段的内存地址重叠时,它们的值保持不变,这就是为什么结果是最后一个字段的两倍(v.b)。
我最初认为使用重叠字段的目的是 只使用其中一个,如果我也尝试使用另一个,则会出错 应该被抛出。
SomeValType v = new SomeValType();
v.a = 2;
v.b = 4 ;
Console.WriteLine(v.a); // the value is 4
Console.WriteLine(v.b); // the value is 4
Console.WriteLine(v.a + v.b); //the sum=4+4=8
Console.ReadLine();