我在C#代码中使用了一个非常简单的三元表达式:
helperClass.SomeData = helperClass.HasData ? GetSomeData() : GetSomeOtherData();
在这两种情况下,表达式的每个路径上的函数都返回一个非null对象,但是如果我在调试器中查看结果,它将为null,直到我在代码中引用它,例如使用assert:< / p>
Debug.Assert(helperClass.SomeData != null);
只有在调试模式下使用“x64”或“Any CPU”平台设置时才会出现这种情况。它在“x86”模式下很好。
在假设我在编译器或调试器中发现了一个错误之前,我会非常谨慎,但我找不到任何其他解释这种行为。
这是一个完整的类来做一个repro,只需在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调试器中的错误吗?我正在使用调试模式,因此不应该存在优化。
答案 0 :(得分:9)
根据Eric Lippert的建议,这可能是一个错误,我已经针对此问题提交了正式的Connect错误:https://connect.microsoft.com/VisualStudio/feedback/details/684202
感谢大家的反馈!
更新:他们回复我说他们已经在下一版本的编译器中修复了这个角落。万岁! :)
答案 1 :(得分:4)
对我来说,这似乎不是调试器中的错误,但可能是编译器...
将代码更改为
时{ helperClass.SomeData = helperClass.HasData ? GetSomeData() : GetSomeOtherData(); }
生成的IL不同,调试器按预期工作......