【问题标题】:What could cause an assignment to not work?什么可能导致作业无法进行?
【发布时间】:2026-01-15 02:35:01
【问题描述】:

我正在使用 C# 开发一个项目,由于某种原因,当我尝试为枚举变量赋值时,赋值不会发生。我会复制我的代码,但这实际上只是一个简单的任务。是这样的:

testVar = MyEnum.TYPE_OF_ENUM;

其中testVar 的类型为MyEnum。当我使用 VisualStudio 调试器单步执行这一行时,我可以看到 testVar 的值没有改变。是什么可能导致这样的任务失败?

编辑:

好的,我将提供更多上下文。

public enum MyEnum1
{
    ONE,
    TWO,
    THREE,
    FOUR,
    FIVE,
    SIX,
    SEVEN,
    EIGHT
}

public enum MyEnum2
{
    A,
    B,
    C,
    D,
    E,
    F
}

public void StateMachine(MyEnum1 state1)
{
    if(state2 == MyEnum2.A)
    {
        switch (state1)
        {
            case MyEnum1.ONE:
                state2 = MyEnum2.B;
                MyFunc(MyEnum2.B);
                break;
            default:
                break;
        }
    }
    else if (state2 == MyEnum2.B)
    {
        switch(state1)
        {
            case MyEnum1.ONE:
                state2 = MyEnum2.B;
                MyFunc(MyEnum2.B);
                break;
            case MyEnum1.THREE:
                state2 = MyEnum2.C;
                MyFunc(MyEnum2.C);
                break;
            default:
                break;                
        }
    }
    // Etcetera
}

state2 = whatever 分配发生故障。 (state2 是字段,不是属性)

【问题讨论】:

  • 如果您可以发布对您有帮助的枚举定义。
  • 您能否为问题添加更多上下文?也许是枚举的定义和 testVar 的定义,包括(私有、公共限定符)
  • 你在赋值之前查看过testVarMyEnum.TYPE_OF_ENUM的值吗?你能提供更多的背景信息吗?
  • 这项任务似乎大部分时间都有效。只有在 case MyEnum1.ONE: 下的 else if 部分才会失败。

标签: c# enums variable-assignment


【解决方案1】:

一种可能性是设置器损坏的属性:

class C
{ 
    private MyEnum foo = MyEnum.Something;
    public MyEnum Foo 
    {
        get { return foo; }
        set { }
    }

    void DoSomething()
    {
        Foo = MyEnum.SomethingElse; // does nothing
    }
}

【讨论】:

    【解决方案2】:

    如果您的枚举有多个具有相同基础值的值,它可能看起来不会改变:

    public enum MyEnum {
        One = 1,
        Two = 1,
    }
    

    在这里,您只会看到One。类似地,标志枚举如下:

    [Flags]
    public enum MyEnum {
        One = 1,
        Two = 2,
        All = One | Two,
    }
    

    你永远不会看到All,只会看到One | Two

    【讨论】:

      【解决方案3】:

      是 MyEnum.TYPE_OF_ENUM 是枚举中的第一个值,还是 TYPE_OF_ENUM 分配给整数值 0?

      未初始化的枚举将被设置为 0,因此它可能已经匹配。

      否则,您很可能会发生尚未注意到的其他事情。

      【讨论】:

      • 这是个好主意,尽管在这种情况下并非如此。
      • 你是对的,这是我没有注意到的。事实证明,由于线程问题,异常在 MyFunc 中被抛出,并以改变 state2 的方式进行处理。
      最近更新 更多