C#枚举的奇怪行为

5 c# enums class

我在这里开发游戏,发现这个有趣的错误.假设你有这个枚举:

public enum ItemType 
{
    Food,
    Weapon,
    Tools,
    Written,
    Misc
};
Run Code Online (Sandbox Code Playgroud)

一个基类

public class BaseItem
{
    public string Name = "Default Name";

    public ItemType Type = ItemType.Misc;
}
Run Code Online (Sandbox Code Playgroud)

以及它的两个实例:

Ins1 = new BaseItem
{
   Name = "Something",
   Type = ItemType.Food
};

Ins2 = new BaseItem
{
   Name = "Something too",
   Type = ItemType.Tools
}
Run Code Online (Sandbox Code Playgroud)

这就是我发生的事情:第一个实例的类型将保留为基类中的预初始化,即使我在其构造函数中指定我希望类型为Food.第二个实例的类型将正确设置为工具.

如果,我在食物之前添加了一个新的枚举值,例如:

public enum ItemType 
{
    Nothing,
    Food,
    Weapon,
    Tools,
    Written,
    Misc
};
Run Code Online (Sandbox Code Playgroud)

那么第一个实例的类型就像预期的那样,食物.第二个实例的类型也是正确的.

什么可能导致这种行为?简而言之,所有其类型已在构造函数中设置为枚举的第一个值的实例实际上将返回到它们在BaseItem定义中具有的值.在第一个枚举值之前添加额外的值可以解决问题,显然; 但这是错的,所以我想知道可能导致这个问题的原因.

谢谢!

---稍后编辑---如果这有帮助:不对BaseItem中的"Type"字段进行任何初始化,只留下大括号构造函数进行初始化,一切正常,而不向枚举添加"Nothing"值.

为此表示歉意; 经过一些挖掘,似乎它只是一个Unity的bug.其他一些人也遇到过它.我解决了这个问题; 每个人都得到我的投票,我会添加自己的答案; 也许其他一些Unity用户会找到它.非常感谢您的帮助和兴趣!

小智 2

如果有其他 Unity 用户在这里搜索信息,认为这是一些 .NET 行为问题:这似乎是一个仅限 Unity 的错误。其他人也遇到过。只需避免在类本身中对此类内容进行任何类型的初始化,或使用属性即可。

这绝对不是 Microsoft .NET 问题,也不是 Mono .NET 问题(您可以随时使用相同的代码启动 Mono 项目,并且它将正常工作)。