我使用泛型属性从Session中提取'long'值,然后崩溃。
所以我有:
public static T Get<T>(string key)
{
if(...)
return (T)System.Web.HttpContext.Current.Session[key];
...
}
调试时,值为4,然后崩溃。
答案 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;
我实际上正在改变事物的本质,d
和l
没有相同的表示,一个是双宽度浮点,值为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)