C# 使用固定大小数组创建不安全结构时,数组是否初始化为默认值?

C# 使用固定大小数组创建不安全结构时,数组是否初始化为默认值?,c#,struct,unsafe,C#,Struct,Unsafe,考虑以下代码: public unsafe struct MyStruct { public fixed int Nums[128]; } private static void DoSomething() { MyStruct s = new MyStruct(); unsafe { int val = s.Nums[23]; Console.WriteLine(val.ToString()); //Is this guara

考虑以下代码:

public unsafe struct MyStruct
{
    public fixed int Nums[128];
}

private static void DoSomething()
{
    MyStruct s = new MyStruct();

    unsafe
    {
        int val = s.Nums[23];
        Console.WriteLine(val.ToString()); //Is this guaranteed to be "0"?
    }
}
在这种情况下,是否可以保证在创建新的
MyStruct
时,每个索引的
Nums
值都将为0


在我自己的测试中,它看起来确实被初始化为默认值,但我问是因为它不安全

但是从

18.7个固定大小缓冲区开始,然后继续

有几个参考文献,其中最值得注意的是

固定大小的缓冲区不接受明确的分配检查 (§5.3)和固定大小的缓冲区成员被忽略 结构类型变量的确定赋值检查。当 固定大小缓冲区成员的最外层包含结构变量为 静态变量、类实例的实例变量或 数组元素,固定大小缓冲区的元素将自动 初始化为其默认值(§5.2)在所有其他情况下 固定大小缓冲区的初始内容未定义。


现在,我自己还没有测试过,这些规范的语言有时很难完全理解。然而,这似乎与您在我的使用中的发现一致,这些都不适用吗
s
不是静态变量,也不在类或数组中。“最外面的包含结构变量”指的是什么?@MineR按照我的理解,如果您将
MyStruct s
设置为静态变量或实例变量,则会将其初始化为默认值。然而,我对你的发现很感兴趣,我也在试图找到这个问题的答案。我试图用我正在制作的结构透明地替换int。但我同意OP的例子中的值是未定义的。