在x64平台上的调试器中奇怪的三元运算符行为

我在C#代码中使用了一个非常简单的三元表达式:

helperClass.SomeData = helperClass.HasData ? GetSomeData() : GetSomeOtherData(); 

在这两种情况下,表达式的每个路径上的函数都返回一个非null对象,但是如果我在调试器中查看结果,它将为null,直到我在代码中引用它,例如使用assert:

 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调试器中的错误吗? 我正在使用调试模式,因此不应该存在优化。

考虑到Eric Lippert的建议,这可能是一个错误,我已经为此问题提交了正式的Connect错误: https : //connect.microsoft.com/VisualStudio/feedback/details/684202

感谢大家的反馈!

更新 :他们回到我身边说他们已经在下一版本的编译器中修复了这个角落的情况。 万岁! 🙂

对我来说,这似乎不是调试器中的错误,但可能是编译器…

将代码更改为时

 { helperClass.SomeData = helperClass.HasData ? GetSomeData() : GetSomeOtherData(); } 

生成的IL是不同的,调试器按预期工作…