怎么会发生这种情况?

Beh*_*ooz 1 c# pointers

struct a { public int x; }
struct c { public byte x; }
unsafe class Program
{
    static void Main(string[] args)
    {
        a V = new a();
        V.x = 1;
        c* b = (c*)(void*)&V;
        for(int n = 0;n != 300;n++) b->x++;
        Console.WriteLine(V.x);
        Console.ReadKey(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

45

它确实返回45.
为什么不抛出任何例外?

ang*_*son 6

为什么你会期望它抛出异常?

默认情况下,C#代码未选中,这意味着溢出等只是默默地被忽略.您可以通过转到项目属性,构建选项卡,然后单击选项卡内容中的"高级"按钮,找到此设置的当前项目设置.在出现的对话框中,您应该有一个"检查算术溢出/下溢".默认情况下,此设置未选中.

在这种情况下,你通过一个转换为c的指针递增32位(4字节)int值x的第一个字节,并且你将它递增300次.

这会使其增加256次,从而使其返回0,然后再增加44次.从1开始,它现在是45.

您可以通过执行以下代码轻松测试:

Byte b = 255;
b++;
Console.Out.WriteLine("b=" + b);
Run Code Online (Sandbox Code Playgroud)

你会得到:

B = 0

不是溢出异常.

说了这么多,你可能不应该使用指针和不安全的代码,直到你真正需要它.