在代码I中将C#Nullable <enum>设置为-1,将其设置为null

时间:2018-03-15 23:11:50

标签: c# enums null nullable

由头:

ChestType是一个枚举

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

slotAndChestIndex是ChestType?[]

chestSlotsAndChestsSaved是一个int []

(抱歉名字不好)

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

我相信上面这句话说: &#34;如果我不能将此int转换为ChestType?然后将其表示为null&#34;

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

我在这里做错了吗?当我尝试将其设置为默认值(ChestType?)时,它仍将其设置为-1 lol。我认为任何Nullable类型的默认值都是null。

请告诉我我不理解的事情!

2 个答案:

答案 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。