我有一个object
,其数字大于零(已授予)。让我们给它42.它最初是HttpContext.Session
集合的一部分。
Session["myNumber"] = 42;
object obj = Session["myNumber"];
我尝试将它用作铸造的int:
int num = (int)obj;
返回0
。
但是,我设法得到了我想做的事情:
int num = int.Parse(obj.ToString());
这给了我42
。
这是否有意义,可能是声明或类型或其他问题吗?
答案 0 :(得分:5)
我在下面尝试提出的关键点是,是的 如果 ,实际的obj
实际上不是{{1}但是足够int
- 就像unbox工作一样。在理解它方面,我要看的主要是:int
。
好的,邪恶的代码: - 首先是重要的一点:
obj.GetType()
我是怎么做这个怪物的?
我撒谎和欺骗......基本上,我这样做了:
static void Main()
{
object obj = Evil();
int i = (int)obj; // 0
int j = int.Parse(obj.ToString()); // 42
}
但在CLI级别它是有效的......
enum bar {
@42 = 0 // not legal C#... "42" is not a valid identifier
}
答案 1 :(得分:3)
你描述的内容根本不会发生。
如果在取消装箱对象时获得值0
,则该对象实际上包含一个装箱的int
,其实际值为0
。
取消装箱值的唯一方法是使用值的确切类型,这意味着如果它不是int
,则会出现异常。
您的代码中必须有其他内容才能导致此问题。
答案 2 :(得分:1)
是的,它确实有意义,因为'42'可以用很多方式表示。它是一个字符串?它是整数吗?它是十六进制字符串吗?是香蕉和橘子(不是开玩笑)?
所以当你问C#“int.Parse”时你告诉C#“这个东西是一个整数,使用标准的C#字符串表示法来表示整数。
当你用“(int)obj”行告诉C#时,你说这个东西已经是你想要的整数。
希望有所帮助。
答案 3 :(得分:1)
当我执行代码时
object obj = 42;
int num = (int)obj;
int num2 = int.Parse(obj.ToString());
在两种情况下都返回42。
所以,你的obj必须是对象以外的东西(如你所说)。因此,我们将使用声明的类型og obj来进一步回答这个问题。