2

考虑这段代码:

private static void Main(string[] args)
{
    short age = 123;
    object ageObject = age;
    //var intAge = (int)ageObject;//Specified cast is not valid.
    int newAge= (short)intAge;
    Console.ReadLine();
}

我必须为对象分配一个短值并再次转换为int,但是当我尝试这样做时:var intAge = (int)ageObject;我得到:指定的转换无效。我不知道为什么?

在谷歌搜索后,我发现应该转换为short并分配给int:int newAge= (short)intAge;

为什么我们应该转换为short并分配给int?

为什么编译器有这种行为?

4

4 回答 4

4

失败是运行时错误。

原因是age值已被装箱到对象中;将其拆箱为不正确的类型 ( int) 是失败的 - 它是short.

您注释掉的行上的演员表是拆箱操作,而不仅仅是演员表。

于 2013-07-19T11:06:22.090 回答
2

利用

Convert.ToInt32(ageObject) instead.

它会工作

于 2013-07-19T11:09:36.607 回答
1

我不明白您为什么要尝试将short 转换为object,然后再转换为int。

您可以通过以下方式进行 short -> int 转换:

{
short age = 123;
int intAge1 = (short)age;
int intAge2 = (int)age;
int intAge3 = Int16.Parse(age.ToString());
}
于 2013-07-19T11:15:04.180 回答
0

装箱的值只能拆箱为完全相同类型的变量此限制有助于速度优化,使 .NET 1.x 在泛型出现之前变得可行。看看这个

简单值类型实现 IConvertible 接口。您使用 Convert 类调用

      short age= 123;
    int ix = Convert.ToInt32(age);
于 2013-07-19T11:07:16.677 回答