我有以下来源:
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);
}
答案 0 :(得分:6)
但为什么?
因为您从装箱int
到long
取消装箱。它失败的方式与没有泛化的失败完全相同:
int original = 0;
object boxed = original;
long unboxed = (long) boxed; // Bang!
取消装箱转化要完成相同类型(模数枚举和签名/无签名)。