我有一个字典,用于存储不同类型的变量(字符串,双精度型,整数等),它们存储为对象。
我有一个通用的Set方法和一个通用的get方法。
private static Dictionary<int, object> dict = new Dictionary<int, object>();
public static void Set<T>(int key, object value)
{
dict.Add(key, (T)value);
}
public static T Get<T>(int key)
{
dict.TryGetValue(key, out object value);
return (T)value;
}
static void Main(string[] args)
{
Set<int>(1, 100);
Get<double>(1);
}
在Main中,我试图将变量100保存为整数,这是可行的,它“作为对象”存储在字典中。 现在,当尝试获取变量并将其强制转换为两倍时,会抛出IllegalCastException,但是为什么呢? 从对象到双精度的显式转换以及从int到double的显式转换都是可用的。
答案 0 :(得分:5)
您不会将从object
广播到int
或double
。您unbox。而且拆箱规则很明确-您只能取出与输入内容完全相同的类型。(在枚举和基础类型周围插入一些与当前问题不完全相关的警告)
要使值类型的拆箱在运行时成功,要拆箱的项目必须是对以前通过对该值类型的实例进行装箱创建的对象的引用。尝试取消对
null
的装箱会导致NullReferenceException
。尝试取消对不兼容的值类型的引用的装箱会导致InvalidCastException
。