int.Parse(ToString)与(int)不同

时间:2012-10-18 08:54:42

标签: c# parsing casting

我有一个object,其数字大于零(已授予)。让我们给它42.它最初是HttpContext.Session集合的一部分。

Session["myNumber"] = 42;
object obj = Session["myNumber"];

我尝试将它用作铸造的int:

int num = (int)obj;

返回0

但是,我设法得到了我想做的事情:

int num = int.Parse(obj.ToString());

这给了我42

这是否有意义,可能是声明或类型或其他问题吗?

4 个答案:

答案 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来进一步回答这个问题。