当使用两个重叠字段时,为什么下面的代码在没有错误的情况下运行?

时间:2015-01-20 11:18:06

标签: c#

以下代码运行时没有错误,但结果是错误的(它给出了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();
    }
}

2 个答案:

答案 0 :(得分:1)

简短回答:该计划以通常的方式计算v.a + v.b

长答案: v.av.b位于相同的内存位置(它们的地址相同)。将值分配给v.a会导致将相同的值分配给v.b,而反之亦然

因此,v.a = 22v.a分配v.b,后续v.b = 44分配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();