我在我的 C# 代码中使用了一个非常简单的三元表达式:
helperClass.SomeData = helperClass.HasData ? GetSomeData() : GetSomeOtherData();
在这两种情况下,表达式的每个路径上的函数都返回一个非空对象,但如果我在调试器中查看结果,它是空的,直到我在代码中引用它,例如使用断言:
Debug.Assert(helperClass.SomeData != null);
只有在 Debug模式下使用“x64”或“任何 CPU”平台设置时才会出现这种情况。在“x86”模式下没问题。
在假设我在编译器或调试器中发现错误之前,我尽量保持谨慎,但我找不到对此行为的任何其他解释。
这是一个完整的重现类,只需在 x64 模式下的调试器中调用 SomeClass.SomeAction() 并逐步查看它:
public class SomeClass {
public bool HasData;
public object SomeData;
private SomeClass() {
HasData = false;
}
public static void SomeAction() {
var helperClass = new SomeClass();
// Exhibits weird debugger behavior of having helperClass.SomeData = null after this line:
helperClass.SomeData = helperClass.HasData ? GetSomeData() : GetSomeOtherData();
// Note that trying helperClass.SomeData.ToString() returns a debugger error saying SomeData is null
// But this code is just fine
//if(helperClass.HasData) {
// helperClass.SomeData = GetSomeData();
//}
//else {
// helperClass.SomeData = GetSomeOtherData();
//}
// In both cases though, after this line things are fine:
Debug.Assert(helperClass.SomeData != null);
}
private static object GetSomeData() {
return new object();
}
private static object GetSomeOtherData() {
return new object();
}
}
我是不是遗漏了什么或者这是 x64 调试器中的错误?我正在使用 Debug模式,所以应该没有优化。
最佳答案
根据 Eric Lippert 的建议,这可能是一个错误,我已经针对此问题提交了一个官方 Connect 错误:https://connect.microsoft.com/VisualStudio/feedback/details/684202
感谢大家的反馈!
更新:他们回复我说他们已经在下一版本的编译器中修复了这个极端情况。万岁! :)
关于c# - x64 平台上调试器中奇怪的三元运算符行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7067354/