两个数据类型变量在 C# 中相互引用



我有很长一段时间以来见过的最奇怪的错误。我在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在任何时候都应该等于M1YM2X == M2Y == M2XY类似。

但是,调试函数时,在foreach部分的第一行,我得到M1Y增加了 d(此时等于1),但也M2Y

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

谢谢!

这样做的原因并不像 .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);

您实际上是在制作a,并且b都使用相同的变量,这使它们成为别名。

它会打印出1.

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

最新更新