C# Nullable<Enum> 在代码中将其设置为 null 时被设置为值 -1



借口:

胸部类型是一个枚举

public enum ChestType
{
COMMON,
GEMNGOLDCHEST,
GODLYCHEST,
ASSCHEST
}

slotAndChestIndex 是 ChestType?[]

chestSlotsAndChestsSave 是一个 int[]

(对不起,坏名字)

slotAndChestIndex[i] = (ChestType?)chestSlotsAndChestSaved[i] ?? null;

我相信上面的台词说: "如果我不能把这个 int 投到箱型上?然后将其表示为空">

然而,胸部类型被设置为-1的值,这对我来说似乎很奇怪。

我在这里做错了什么吗?当我尝试将其设置为默认值(胸部类型?)时的事件,它仍然将其设置为 -1 哈哈。我认为任何可为空的类型都是空的。

请告诉我我不明白的地方!

您无法验证它是否以这种方式在枚举中定义;它只会在其中分配变量chestSlotsAndChestSaved[i]的值(即使它是-1并且未在您的枚举中定义)。

验证这一点的方法是:

slotAndChestIndex[i] = (ChestType?)(Enum.IsDefined(typeof(ChestType), chestSlotsAndChestSaved[i]) ? chestSlotsAndChestSaved[i] : (int?)null);

PS:我还没有测试过代码,即使Enum.IsDefined(typeof(ChestType), chestSlotsAndChestSaved[i])是你的路。

??运算符和你正在做的演员都不像你想象的那样。

首先,您使用的强制转换永远不会产生 null 值 - 从 int 转换为(大多数)枚举将只生成枚举类型的值,但可能具有数值,而不是枚举成员之一。您投射到ChestType?而不是ChestType的事实并不能改变这一点。此外,如果直接强制转换像您所示的那样执行并且无法执行,则会引发异常,并且结果不会为 null。对于这样的文字转换,这不应该发生,但在类之间的大小写时可能会发生。

接下来,??运算符(也称为 null 合并运算符)在左操作数不为 null 时计算左操作数,如果左操作数为 null,则计算为右操作数。所以如果chestSlotsAndChestSaved[i]等于null,表达式将成为右操作数 - 然而,由于右操作数总是null,表达式的那部分实际上什么也不做。

总的来说,slotAndChestIndex[i]

返回为 -1的最可能原因是因为chestSlotsAndChestSaved[i]是 -1。

相关内容

  • 没有找到相关文章

最新更新