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

Jef*_*ser 13 c# ternary-operator visual-studio-2010

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

helperClass.SomeData = helperClass.HasData ? GetSomeData() : GetSomeOtherData();
Run Code Online (Sandbox Code Playgroud)

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

Debug.Assert(helperClass.SomeData != null);
Run Code Online (Sandbox Code Playgroud)

如果我在调试模式下使用"x64"或"任何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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么或者这是x64调试器中的错误吗?我正在使用调试模式,因此不应该存在优化.

Jef*_*ser 9

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

谢谢大家的反馈!

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