Generic Cast,将int转换为double是不可能的

Ani*_*ima 1 c# generics casting

我有一个存储不同类型变量(字符串,双精度,整数等)的字典,它们存储为对象.

我有一个通用的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);
}
Run Code Online (Sandbox Code Playgroud)

在Main我试图将变量100保存为整数,这是有效的,它被存储在字典中"作为对象".现在,当尝试获取变量,将其转换为double时,抛出IllegalCastException,但为什么呢?可以使用从对象到double的显式转换,以及从int到double的显式转换.

Dam*_*ver 5

你不objectintdouble.你unbox.拆箱规则很明确 - 你只能拿出与你输入完全相同的类型.(在枚举和基础类型周围插入一些与手头问题不完全相关的警告)

要使值类型的取消装箱在运行时成功,要取消装箱的项必须是对先前通过装箱该值类型的实例创建的对象的引用.试图取消装箱null导致a NullReferenceException.尝试取消对不兼容的值类型的引用会导致a InvalidCastException.