你可以在c#中将对象强制转换为长对象吗?

时间:2010-06-16 20:32:21

标签: c# asp.net generics

我使用泛型属性从Session中提取'long'值,然后崩溃。

所以我有:

public static T Get<T>(string key)
{
    if(...)
        return (T)System.Web.HttpContext.Current.Session[key];

    ...
}

调试时,值为4,然后崩溃。

3 个答案:

答案 0 :(得分:9)

如果您坚持保留通用方法,可以使用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()不适用于所有转换。

答案 1 :(得分:6)

使用Convert.ToInt64

答案 2 :(得分:2)

所以,这就是问题所在:

你有一个十进制(100米),被装入一个对象(在会话中)并且你试图将它拆箱成长,这就是事情发生的地方。

.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
顺便说一下,大师的无耻撕裂(here for more and better explanations