泛型方法中的InvalidCastException

时间:2013-02-15 16:25:41

标签: c# generics casting

我有以下来源:

    private T GetValue<T>(object value)
    {
        return (T)value;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Int64 integer = GetValue<Int64>(0);
    }

因此常量0是Int32,必须在泛型方法GetValue中强制转换为Int64。 但这会导致InvalidCastException。

但为什么?

当我使用Int64作为参数时,它可以正常工作。

    private T GetValue<T>(object value)
    {
        return (T)value;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Int64 zero = 0;
        Int64 integer = GetValue<Int64>(zero);
    }

感谢Jon和Brian。 我的最终(简化)解决方案是这样的。

    private T GetValue<T>(object value)
    {
        return (T)Convert.ChangeType(defaultValue, typeof(T));
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Int64 integer = GetValue<Int64>(0);
    }

1 个答案:

答案 0 :(得分:6)

  

但为什么?

因为您从装箱intlong取消装箱。它失败的方式与没有泛化的失败完全相同:

int original = 0;
object boxed = original;
long unboxed = (long) boxed; // Bang!

取消装箱转化完成相同类型(模数枚举和签名/无签名)。