C# 为什么我可以安全地转换为int,但不能转换为int?

C# 为什么我可以安全地转换为int,但不能转换为int?,c#,winforms,casting,int,C#,Winforms,Casting,Int,为什么这样做有效: 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; //

为什么这样做有效:

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;
}
ComboBox cb=发送方作为ComboBox;
int validSelection=(int)cb.Tag;// 那是因为

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


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

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

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


您的标记可能属于Convert可以处理的类型(例如字符串)。

装箱的值类型只能解除装箱为其实际类型,因此如果
标记的值实际上不是int,则从
对象的转换将失败。此外,如果
标记
的值为null,则转换失败,因为值类型不能为null

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

  • 如果它是一个字符串,解析它
  • 如果它是一个
    Int64
    ,请将其取消装箱到Int64,然后将其转换为
    Int32
  • 如果为null,则返回0

前者要求
标签
具有支持to
ToInt32
方法的
i可转换
。后者要求
Tag
必须是
int
1)
Convert.ToInt32(null)
始终返回0,如前所述

2) 不能将
null
强制转换为
int
,因为
int
表示一个数字。可为空的int(
int?
)允许为空值。

一个cast说:“将内存中表示这个东西的位解释为[任何](
int


转换说:“看,这个东西实际上在内存中是非常不同的,但是你知道如何将它转换成我想要的,所以请这样做并返回结果“

标记的实际类型是什么?@andrischneider您将
标记设置为什么?标记是对象。发送方实际上是组合框吗?是的,发送方是组合框。我正在将他们的SelectedIndex分配给他们自己的Tag属性。实际上,cb.Tag被声明为
对象
(但它可能是OP中的一个字符串)。SelectedIndex在我看来像一个int,但可能不是:comboBoxPlatypusID.Tag=ComboxPlatyPusid.SelectedIndex@Clay,现在我很困惑,既然在。。。嗯,
SelectedIndex
本身?@Frederic:如果用户试图在表单处于“只读状态”时更改组合框的SelectedIndex,我将使用它将组合框的SelectedIndex设置回其原始SelectedIndex。设置SelectedIndex时,我将标记值设置为相同的值。这适用于表单处于“只读”状态时—仅查看数据库中的现有值。因为同一个表单有时也可以作为可编辑表单使用,所以它会被设置为不同的状态……好吧,你可能已经明白了。@Clay,是的,我想现在更清楚了。我建议您寻找那些没有将
标记设置为
SelectedIndex
的代码路径,但之后仍然在问题中练习代码。在这种情况下,您将把
null
强制转换为
int
Tag
对象,如果未赋值,则默认为
null
),这将解释
NullReferenceException
,正如其他人在回答中解释的那样。以及语法
(typename)值
执行强制转换和转换。