相关疑难解决方法(0)

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

我在我的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 …
Run Code Online (Sandbox Code Playgroud)

c# ternary-operator visual-studio-2010

13
推荐指数
1
解决办法
686
查看次数

投射指针和三元?:运算符.我重新改造了车轮吗?

这段代码的最后一行无法编译 castingAndTernary.cpp:15: error: conditional expression between distinct pointer types ‘D1*’ and ‘D2*’ lacks a cast

一个非常聪明的编译器可以没有任何困难,因为它们都可以安全地转换为B*(基类).我不愿意使用static_cast和dynamic_cast等等 - 我担心有一天我会混淆这些类并获得未定义的行为.这就是我创建up_cast模板的原因.此模板在允许的转换中完成了最低限度.有更简单的方法吗?还有其他的解决方法,但我不禁想到,我可以使用更简单,更安全的东西吗?

struct B{ };
struct D1 : public B{ };
struct D2 : public B{ };

template<typename T,typename V>
T up_cast(V x) {
        return x;
}
int main() {
        bool boolean_expression = true;
        B * b;
        b = new D1;
        b = new D2;
        b = boolean_expression ? up_cast<B*>(new D1) : up_cast<B*>(new D2);
        b = boolean_expression ? new D1 : new …
Run Code Online (Sandbox Code Playgroud)

c++ casting ternary-operator

10
推荐指数
3
解决办法
3587
查看次数

标签 统计

ternary-operator ×2

c# ×1

c++ ×1

casting ×1

visual-studio-2010 ×1