两个数据类型变量在C#

时间:2019-02-18 18:16:30

标签: c# .net visual-studio-2017

我有很长一段时间以来见过的最奇怪的错误。我正在Visual Studio 2017中的C#中工作,我必须使用似乎指向内存中同一点的数据变量。

具体来说,我定义了函数

static void GetDataMoments(IEnumerable<double> vec, out double M2X, out double M2Y, out double M2XY, out double M1Y, out double M1X, out int N)
{
    M2X = 0;
    M2Y = 0;
    M2XY = 0;
    M1Y = 0;
    M1X = 0;
    N = 0;

    foreach (var d in vec)
    {
        M1Y += d;
        M2X += (++N) * N;
        M2XY += d * N;
        M2Y += d * d;
        M1X += N; 
    }

    // For checking
    M1X = (N + 1d) * N / 2; 
}

我在使用此功能时遇到了错误,所以我用

对其进行了调试
double[] vec = Enumerable.Range(1, 100).Select(i => (double)i).ToArray();

因此,M1X在任何时候都应等于M1Y,并且类似地M2X == M2Y == M2XY

但是,在foreach部分的第一行调试函数时,我发现M1Y增加了d(在那一点等于1),但是M2Y

有人以前遇到过吗?我在.Net Framework 4.6.2和4.7.2中都运行了它,所以它与框架无关。

谢谢!

1 个答案:

答案 0 :(得分:1)

这样做的原因并不像.NET中的错误那样险恶或不幸,而仅仅是您欺骗了自己。

请注意,我只是假设,但是由于我可以证明您使用此假设遇到的确切问题,并且这是我可以想到的唯一原因(除了实际的错误),因此我认为这是相当安全的说这是你的问题。

问题不在于问题中的代码,而在于调用它的代码。

让我告诉你:

public static void Test(out int a, out int b)
{
    a = b = 0;

    a++;
    Console.WriteLine(b);
}

您希望此代码输出0,因为它增加了a,而不是b

但是,如果您这样称呼它:

int x;
Test(out x, out x);

您正在有效地使ab都使用相同的变量,这使它们成为别名。

它将打印出1

因此,实质上,您多次将相同的变量传递给您的方法。