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

JNF*_*JNF 2 c# parsing casting

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

Session["myNumber"] = 42;
object obj = Session["myNumber"];
Run Code Online (Sandbox Code Playgroud)

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

int num = (int)obj;
Run Code Online (Sandbox Code Playgroud)

这回来了0.

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

int num = int.Parse(obj.ToString());
Run Code Online (Sandbox Code Playgroud)

这给了我42.

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

Mar*_*ell 5

我试图在下面提出的关键点是,是的,如果实际上obj并不是真的,那么可能是可能的,int但是int对于unbox工作来说是足够的.在理解它方面,我要看的主要是:什么是obj.GetType().

好的,邪恶的代码: - 首先是重要的一点:

static void Main()
{
    object obj = Evil();
    int i = (int)obj; // 0
    int j = int.Parse(obj.ToString()); // 42
}
Run Code Online (Sandbox Code Playgroud)

我是怎么做这个怪物的?

我欺骗和欺骗......基本上,我这样做了:

enum bar {
    @42 = 0 // not legal C#... "42" is not a valid identifier
}
Run Code Online (Sandbox Code Playgroud)

但在CLI级别它是有效的......

static object Evil()
{
    var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(
        new AssemblyName("foo"), AssemblyBuilderAccess.Run);
    var mb = ab.DefineDynamicModule("foo");
    var eb = mb.DefineEnum("bar", TypeAttributes.Public, typeof(int));
    eb.DefineLiteral("42", 0);
    Type t = eb.CreateType();
    return Enum.ToObject(t, 0);
}
Run Code Online (Sandbox Code Playgroud)