c# - 从对象盒类型进行通用转换

标签 c# generics casting boxing unboxing

为什么这样做:

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/

相关文章:

c# - C# Language Specification 是否明确规定比较必须是同一类型?

java:如何修复 Unchecked cast 警告

C# 派生类型的显式转换

c# - 具有类型 T 的通用构造函数的通用存储库

c# - KeyCode 和键盘布局和语言

c# - 将 ContextMenu 命令绑定(bind)到父 View 模型 RelayCommand

c# - 使用 IEnumerable<T> 创建通用集合的通用类

generics - F#:如何对类型值进行模式匹配?

c++ - 将 QByteArray 转换为 `long` 输出相同输入的不同结果

ios - '[双倍的? ]' is not convertible to ' [双]'