由头:
ChestType是一个枚举
public enum ChestType
{
COMMON,
GEMNGOLDCHEST,
GODLYCHEST,
ASSCHEST
}
slotAndChestIndex是ChestType?[]
chestSlotsAndChestsSaved是一个int []
(抱歉名字不好)
slotAndChestIndex[i] = (ChestType?)chestSlotsAndChestSaved[i] ?? null;
我相信上面这句话说: "如果我不能将此int转换为ChestType?然后将其表示为null"
ChestType?然而,它被设置为-1的值,这对我来说似乎很奇怪。
我在这里做错了吗?当我尝试将其设置为默认值(ChestType?)时,它仍将其设置为-1 lol。我认为任何Nullable类型的默认值都是null。
请告诉我我不理解的事情!
答案 0 :(得分:4)
您无法验证它是否以您的枚举方式定义;它只会在其中指定变量chestSlotsAndChestSaved[i]
的值(即使它-1
并且它未在您的枚举中定义)。
您可以通过以下方式验证:
slotAndChestIndex[i] = (ChestType?)(Enum.IsDefined(typeof(ChestType), chestSlotsAndChestSaved[i]) ? chestSlotsAndChestSaved[i] : (int?)null);
PS:我还没有对代码进行过测试,即使Enum.IsDefined(typeof(ChestType), chestSlotsAndChestSaved[i])
是你要走的路。
答案 1 :(得分:2)
??
运营商和您正在做的演员都没有做到您想象的那样。
首先,您使用的强制转换将永远不会产生空值 - 从int到(大多数)枚举的转换只会产生枚举类型的值,但可能带有数值,不是枚举成员之一。转换为ChestType?
而不是ChestType
这一事实并未改变这一点。此外,如果按照您已经显示的方式执行直接投射并且无法执行,则会引发异常,结果将不为空。对于像这样的文字转换,这绝不应该发生,但是当在类之间进行套接时可能会发生。
接下来,??
运算符(也称为null-coalescing运算符)如果左操作数不为null则求值为左操作数,如果左操作数为null,则求值为右操作数。因此,如果chestSlotsAndChestSaved[i]
等于null
,则表达式将成为右手操作数 - 但由于右操作数始终为null
,因此表达式的该部分实际上无效。
总体而言,slotAndChestIndex[i]
返回-1的最可能原因是因为chestSlotsAndChestSaved[i]
为-1。