你能在C#中将一个对象转换为长整型吗?

5
我正在从Session中提取一个“long”值,使用通用属性,但程序崩溃了。
所以我有以下代码:
public static T Get<T>(string key)
{
    if(...)
        return (T)System.Web.HttpContext.Current.Session[key];

    ...
}

在调试时,当数值为4时,程序会崩溃。


3
你确定这个long类型的变量确实是long而不是int吗?如果强制转换的话会造成程序崩溃。在该值上执行GetType().Name,以查看该项的真实类型。 - SWeko
是的,它是一个整数,值为4。(见上文) - Blankman
3
请参考这篇文章:http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx,它讲述了类型转换和装箱,这可能是你遇到的问题。 - SWeko
long userID = 100m; // 这个 'm' 是将它变成 long 类型吗? - Blankman
相关:https://dev59.com/FU7Sa4cB1Zd3GeqP332x - Marc Gravell
显示剩余2条评论
3个回答

10
如果您坚持使用通用方法,可以使用Convert.ChangeType():
public static T Get<T>(string key)
{
    if (...)
        return 
          (T) Convert.ChangeType(System.Web.HttpContext.Current.Session[key],
                                 typeof(T));

    ...
}

这将使您能够调用:

long n = Get<long>("sessionkey");

但要注意:Convert.ChangeType()并非所有转换都适用。


它到底哪里出了问题?所以基本上不能在所有类型中“安全地”完成Session值的通用getter。 - Blankman
如果可以从一种类型转换到另一种类型,则 Convert.ChangeType() 函数将起作用。但是,将字符串转换为 int 不起作用。文档可以在此找到:http://msdn.microsoft.com/en-us/library/dtb69x08.aspx - Philippe Leybaert
但是将字符串转换为整数可以使用 Convert.ToInt32("23"); 我只是不太懂这些东西 :) - Blankman
使用通用方法将"任何东西"转换为"任何东西"并不容易。您需要执行很多步骤和检查。如果您真的想要实现这个功能,可以看看开源的"Vici Core"库(http://viciproject.com/wiki/Projects/Core/Home)。它包含了一些通用方法,可以尝试将任何东西转换为任何东西。您的返回语句将简单地变为"return Session[key].Convert<T>()"。 - Philippe Leybaert

6
使用Convert.ToInt64函数。

3
所以,问题出在这里:
您有一个十进制数(100m),它被装箱成一个对象(在会话期间),您试图将其拆箱为长整型,这就是问题所在。
实际上,.net中的强制转换运算符有两个作用:
object o="string";
string s=(string) o

这里对象的值从未改变,它仍然是同一个“字符串”,只是其引用发生了变化。 然而,当我执行以下操作时:

double d= 3.7;
long l = (long) x;

我实际上正在改变事物的本质,dl没有相同的表示方式,一个是双宽浮点数,值为3.7,另一个是64位整数,值为3。

.net运算符可以做到这两个事情,但是它不能同时进行,这就是你的问题所在...

decimal d=4m;
object o = d;
long l1 = (long)o; //blows up, the runtime error you got
long l2 = (decimal)o; //compile time error
long l3 = (long)(decimal)o; //first we unbox, then we convert - works

顺便说一下,这是对大师的无耻抄袭(在此处获取更多和更好的解释


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接