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

C# Nullable<Enum> is being set a value of -1 when in code I'm setting it to null

借口:

ChestType 是一个枚举

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

slotAndChestIndex 是 ChestType?[]

chestSlotsAndChestsSaved 是一个整数[]

(对不起,不好的名字)

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

我相信上面这行是说: "If I cant cast this int to a ChestType? then express it as null"

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

我是不是做错了什么?当我尝试将其设置为默认值(ChestType?)时发生的事件仍将其设置为 -1 哈哈。我认为任何 Nullable 类型的默认值都是 null。

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

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

您可以通过以下方式验证这一点:

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

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

?? 运算符和您正在执行的转换都不是您所想的那样。

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

之间套管时可能会发生

接下来,?? 运算符,也称为 null-coalescing 运算符,如果左操作数不为空,则求值为左操作数,如果左操作数为空,则求值为右操作数无效的。因此,如果 chestSlotsAndChestSaved[i] 等于 null,表达式将成为右手操作数 - 但是由于右操作数始终是 null,表达式的那部分实际上什么都不做。

总的来说,slotAndChestIndex[i] 返回 -1 的最可能原因是因为 chestSlotsAndChestSaved[i] 是 -1。