【问题标题】:C# Nullable<Enum> is being set a value of -1 when in code I'm setting it to null [duplicate]C# Nullable<Enum> 在代码中设置为 -1 时我将其设置为 null [重复]
【发布时间】:2018-03-15 23:11:50
【问题描述】:

借口:

ChestType 是一个枚举

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

slotAndChestIndex 是 ChestType?[]

chestSlotsAndChestsSaved 是一个 int[]

(对不起,名字不好)

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

我相信上面的行说: “如果我不能将此 int 转换为 ChestType?那么将其表示为 null”

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

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

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

【问题讨论】:

  • "ChestType 是一个枚举" -- 你能发布这个枚举吗?
  • 一个枚举可以有一个不限于其命名成员之一的值(请参阅current C# spec 的“9.3.10 枚举类型”一章)。因此,为什么将 int 强制转换为枚举类型永远不会失败。由于您想检查一个 int 值是否与给定的枚举成员匹配,您应该执行类似于 Chaim Eliyah 评论中提供的链接所示的操作...
  • 公平地说,对于整数,它确实说你可以EnumName thing = (EnumName)yourInt;;我从未尝试过使用可为空的枚举...
  • ?? null 毫无意义。这意味着if a value is null, return null - 它已经没有该代码。
  • @ChaimEliyah 是的,我认为这可能是一个糟糕的设计,但它很好地解决了一个小问题。还看不到它会杀死我的程序...谢谢您的回答!

标签: c# enums null nullable


【解决方案1】:

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

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

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

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

【讨论】:

  • 嗯,这就像一个魅力:D 我仍然不完全理解这个陈述,但我想我对我做错了什么有一个要点。谢谢你的回答!
  • 我很乐意为您提供帮助。继续前进!
【解决方案2】:

?? 运营商和你正在做的演员都没有你想的那样。

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

接下来,?? 运算符,也称为空合并运算符,如果左操作数不为空,则计算左操作数,如果左操作数为空,则计算右操作数。因此,如果 chestSlotsAndChestSaved[i] 等于 null,则表达式将成为右手操作数 - 然而,由于右手操作数始终是 null,表达式的这一部分实际上什么都不做。

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

【讨论】:

  • 天哪,谢谢你的详细回答。我必须通读一遍才能更好地理解。我想我混淆了??和 ?以三元运算表示的运算符...干杯!
  • ?? 运算符的作用是“如果第一个值不为空,则使用它;如果不是,则使用右边的那个”。干杯!
猜你喜欢
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
相关资源
最近更新 更多