C# 为什么stackalloc初始化具有不一致的行为?

C# 为什么stackalloc初始化具有不一致的行为?,c#,C#,以下代码使用非零值初始化两个stackalloc数组。当数组A被正确初始化时,数组B仍然用零填充,这与预期相反 通过分解编译后的可执行文件,可以看到没有为数组B生成初始化代码。这是为什么 using System; namespace ConsoleApp1 { class Program { static unsafe void Main(string[] args) { double a1 = 1;

以下代码使用非零值初始化两个stackalloc数组。当数组A被正确初始化时,数组B仍然用零填充,这与预期相反

通过分解编译后的可执行文件,可以看到没有为数组B生成初始化代码。这是为什么

using System;

namespace ConsoleApp1
{
    class Program
    {
        static unsafe void Main(string[] args)
        {
            double a1 = 1;
            double* A = stackalloc double[] { a1, 0, 0, a1, a1 }; // results in 1 0 0 1 1
            double* B = stackalloc double[] { a1, 0, 0, 0, 0}; // results in 0 0 0 0 0 

            for (int i = 0; i < 5; i++) Console.Write($"{A[i]} ");
            Console.WriteLine();
            for (int i = 0; i < 5; i++) Console.Write($"{B[i]} ");
        }
    }
}
实际结果:

1 0 0 1 1
0 0 0 0 0

谢谢你在这里写了一篇好的评论!这似乎是的复制品。重新编程有点不同,但快速一看,它遇到了相同的问题,也应该得到修复。Dev16中将包含对此的修复

正如@JaredPar所说,这是一个需要修复的bug

作为一个工作狂,我找到了两种方法来避免这个问题

一种是使用常量变量

const double a1 = 1;
double* A = stackalloc double[5] { a1, 0, 0, 0, a1 }; // output 1 0 0 0 1


@ChrisF为什么你希望用
j
替换
i
会有所不同?(没有,但很奇怪)这对我来说真的很奇怪。(也就是说,我已经准备好学习一些东西了;))但是在第二个变量中,将
a1
替换为literal
1
会产生完全不同的结果(它是有效的)。@KirkWoll-我并不是真的期望得到任何东西,但想排除重用变量时可能出现的任何奇怪情况。我曾经遇到过这样的情况,尽管作用域指示了其他情况,变量及其值仍然存在于循环之外。在本例中,我想检查代码是否实际写出了
B
的每个元素,而不仅仅是
B[4]
看起来像编译器中的bug。就我所见,如果你有3个或更多的零常量表达式,而没有非零常量表达式,它就会被触发。我尝试了一个愚蠢的问题:如果你在9月份修复了它,为什么从那以后它没有随所有版本的Roslyn一起发布?修复程序已经发布了。在11月份发布的15.9版本中,您没有看到修复程序的原因是VS停止从我们这里获取修复程序与VS版本发布之间存在延迟。我们在9月初基本上关闭了15.9个工作,因此没有成功。不过,修复程序应该出现在16.0版本中。如果没有,那就意味着它不是傻瓜。
const double a1 = 1;
double* A = stackalloc double[5] { a1, 0, 0, 0, a1 }; // output 1 0 0 0 1
double a1 = 1;
double a0 = 0;
double* A = stackalloc double[5] { a1, a0, a0, a0, a1 }; // output 1 0 0 0 1