为什么这样做:
decimal dec = new Decimal(33);
double dd = (double) dec;
Console.WriteLine(dd);
但不是这个:
decimal dec = new Decimal(33);
object o = (object)dec;
double dd = (double) o;
Console.WriteLine(dd);
第二个例子抛出:
System.InvalidCastException: Specified cast is not valid.
这个问题来自于我有一个泛型方法的情况
public T GetValue(string q)
从数据源获取值。这些值的类型是未知的,但该方法假定它可以将值转换为 T。有时值将是 object{decimal} 而 T 将是 double,在这种情况下将抛出 InvalidCastException。但原则上这应该不是问题,因为该值是可以转换为 double 的小数(尽管被对象装箱)。
一般情况下我该如何处理?
最佳答案
您只能将装箱的值类型转换回装箱的确切类型。从装箱类型到您正在转换的类型是否存在隐式或显式转换并不重要to——你仍然需要转换为盒装类型(以便拆箱),然后从那里取出它。
在示例中,这意味着两次连续转换:
double dd = (double) (decimal) o;
或者,使用 Convert
方法:
double dd = Convert.ToDouble(o);
当然,这对您的实际用例不起作用,因为您不能立即从泛型类型参数转到 ToDouble
。但是只要目标类型是IConvertible
,你就可以这样做:
double dd = (double)Convert.ChangeType(o, typeof(double));
其中泛型类型参数 T
可以替换为 double
。
关于c# - 从对象盒类型进行通用转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20146235/