gpt4 book ai didi

c# - "Use of unassigned local variable"不一致

转载 作者:行者123 更新时间:2023-11-30 14:26:24 26 4
gpt4 key购买 nike

如果我尝试编译这段代码,我会得到 data 的“Use of unassigned local variable”。 (显然 foo = true 本来就更复杂。)

CuppingAttemptData data;
bool purgeData = true;
bool foo = true;

purgeData = foo &&
dataQueue.TryPeek(out data) &&
data.attempt.startTime.AddMilliseconds(timeout) < DateTime.Now &&
dataQueue.TryDequeue(out data);


if (purgeData)
{
DataSerialization.SaveData(new CowID("Missing", "Missing"), data);
}

有问题的使用在倒数第二行:SaveData 调用末尾的变量 data。乍一看,编译器似乎看不到 TryDequeue 保证有设置数据,但这段代码确实编译:

CuppingAttemptData data;
bool purgeData = true;

purgeData = dataQueue.TryPeek(out data) &&
data.attempt.startTime.AddMilliseconds(timeout) < DateTime.Now &&
dataQueue.TryDequeue(out data);


if (purgeData)
{
DataSerialization.SaveData(new CowID("Missing", "Missing"), data);
}

即没有我琐碎的额外条件,编译器可以证明 data 已设置。

这是怎么回事?

当然,我可以通过在顶部将 data 设置为 null 来使其编译,但我有点担心编译器会看到一些我正在不是,而且当我调用 SaveData 时,data 可能没有设置任何合理的值。

我正在使用 Visual Studio 2015(更新 1)和 .Net Framework 4.6.01055。

最佳答案

问题是 && 是短路运算符。考虑您的第一个代码段

purgeData = foo &&
dataQueue.TryPeek(out data) &&
data.attempt.startTime.AddMilliseconds(timeout) < DateTime.Now &&
dataQueue.TryDequeue(out data);

如果 foo 因任何原因为假,则不会评估条件中的其他语句。因此,TryPeekTryDequeue 都不会运行。虽然在您的示例中 foo 永远不会为假,但编译器无法通过一个不平凡的示例知道这一点。也许甚至连一个微不足道的例子都做不到,尽管像 ReSharper 这样更智能的实用程序可能会捕捉到它。

您的第二个代码段可以编译,因为 TryPeek 也保证返回数据。它实际上与 TryDequeue 完全无关。

purgeData = dataQueue.TryPeek(out data) &&
data.attempt.startTime.AddMilliseconds(timeout) < DateTime.Now &&
dataQueue.TryDequeue(out data);

关于c# - "Use of unassigned local variable"不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35422785/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com