3

为什么会这样:

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;
}

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

4

6 回答 6

13

那是因为转换与 cast 不同

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

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

于 2012-07-18T20:54:48.607 回答
7

1)Convert.ToInt32(null)总是返回 0,如文档中所述

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

于 2012-07-18T20:55:46.763 回答
4

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

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

  • 如果是字符串,解析它;
  • 如果是Int64,则将其拆箱为 Int64,然后将其转换为Int32;
  • 如果为空,则返回 0
  • ETC
于 2012-07-18T20:55:25.273 回答
3

前者要求Tag有一个IConvertable支持的ToInt32方法。后者要求它Tag是一个int.

于 2012-07-18T20:55:34.263 回答
1

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

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

于 2012-07-18T20:56:58.187 回答
1

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

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

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

于 2012-07-18T20:54:51.957 回答