借口:
胸部类型是一个枚举
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。