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

标签 c# visual-studio-2010 ternary-operator

我在我的 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/

相关文章:

c# - MVC Entity Framework - 处理 DbContext 的实例?

c# - 使用 TD.NET 运行 NBehave 纯文本场景

c# - Code First - 外键引用在分配 Id 时未加载

javascript - 三元语句是否比 javascript 中的 if/then/else 语句更快?

c# - 如何从泛型中获取 bool 值作为返回对象

c# - "Could not load file or assembly"错误。可以在我的电脑上运行,但不能在其他电脑上运行

c++ - C#相当于C++中的ifstream/ofstream

c++ - CreateProcess() 函数无法运行。错误无法写入内存

c++ - 使用三元运算符初始化引用变量?

javascript - 返回 XML 以及在 React.js 中使用三元运算符调用 JavaScript 函数