【问题标题】:Why can I convert to an int safely but not cast to an int?为什么我可以安全地转换为 int 但不能转换为 int?
【发布时间】:2012-07-18 00:08:37
【问题描述】:

为什么会这样:

ComboBox cb = sender as ComboBox;
int validSelection = Convert.ToInt32(cb.Tag);
if (cb.SelectedIndex != validSelection) {
    cb.SelectedIndex = validSelection;
}

...但是这个:

ComboBox cb = sender as ComboBox;
int validSelection = (int)cb.Tag; // <-- fails
if (cb.SelectedIndex != validSelection) {
    cb.SelectedIndex = validSelection;
}

...出现“对象未设置为对象的引用”的错误?

【问题讨论】:

  • Tag 的实际类型是什么?
  • @AndreiSchneider Object
  • 你将Tag设置成什么?
  • 标签是对象。发件人实际上是一个组合框吗?
  • 是的,发件人是 ComboBox。我将他们的 SelectedIndex 分配给他们自己的 Tag 属性。

标签: c# winforms casting int


【解决方案1】:

已装箱的值类型只能拆箱为它们的实际类型,因此如果 Tag 的值实际上不是 int,则来自 object 的强制转换失败。此外,如果 Tag 的值为 null,则转换失败,因为值类型不能为 null。

另一方面,当您使用Convert.ToInt32 时,该方法会采取任何必要的步骤将值转换为Int32

  • 如果是字符串,解析它;
  • 如果是Int64,将其拆箱为Int64,然后将其转换为Int32
  • 如果为null,则返回0

【讨论】:

    【解决方案2】:

    演员说:“将内存中表示此事物的位解释为 [whatever](在这种情况下为int。)

    一个转换说:“你看,这个东西在内存中其实是很不一样的东西,但是你知道怎么把它变成我想要的,所以请你这样做并返回结果”。

    【讨论】:

    • 语法(typename)value 执行强制转换和转换。
    【解决方案3】:

    1) Convert.ToInt32(null) 总是返回 0,正如 in the documentation 所说的那样

    2) 您不能将null 转换为int,因为int 代表一个数字。 Nullable int (int?) 允许空值。

    【讨论】:

      【解决方案4】:

      前者要求Tag 有一个支持ToInt32 方法的IConvertable。后者要求Tagint

      【讨论】:

        【解决方案5】:

        Convert 有许多重载,允许它尝试从各种数据类型进行转换,例如Convert.ToInt32(string)

        将数字的指定字符串表示形式转换为等效的 32 位有符号整数。

        您的标签可能是 Convert 可以处理的类型(例如字符串)。

        【讨论】:

          【解决方案6】:

          那是因为a conversion is not the same thing as a cast

          cb.Tag 可能是string,而不是int,并且其中一个不能直接转换为另一个。 Convert.ToInt32() 实际上会解析 string 并使用转换后的值创建一个新的 int

          强制转换仅尝试将一个类型的实例解释为另一种类型的实例。

          【讨论】:

          • 实际上,cb.Tag 被声明为object(但在OP的情况下它可能是一个字符串)
          • SelectedIndex 在我看来像一个 int,但也许不是:comboBoxPlatypusID.Tag = comboBoxPlatypusID.SelectedIndex;
          • @Clay,现在我很困惑,为什么要将SelectedIndex 存储到Tag 中,因为它很容易在......好吧,SelectedIndex 本身?
          • @Frederic:如果用户在表单处于“只读状态”时尝试更改组合框的 selectedindex,我将使用它将其设置回其原始 selectedindex。设置 selectedindex 后,我将 Tag 值设置为相同的值。这适用于表单处于“只读”状态时 - 只需查看数据库中的现有值。由于同一表单有时也可用作可编辑表单,因此它会被设置为不同的状态……嗯,您可能明白了。
          • @Clay,是的,我认为现在更清楚了。我建议您查找未将Tag 设置为SelectedIndex 的代码路径,但之后仍会在您的问题中使用代码。在这种情况下,您会将null 转换为intTagobject,如果未分配,则默认为null),这将解释NullReferenceException,正如其他人在他们的答案中所解释的那样。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-12
          • 1970-01-01
          • 1970-01-01
          • 2013-09-22
          • 1970-01-01
          相关资源
          最近更新 更多