1

我有以下来源:

    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);
    }

感谢乔恩和布赖恩。我的最终(简化)解决方案是这样的。

    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);
    }
4

1 回答 1

6

但为什么?

因为你是从一个装箱的拆箱intlong. 它失败的方式与没有泛型的失败完全相同:

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

必须对相同类型(模枚举和有符号/无符号)进行拆箱转换。

于 2013-02-15T16:27:28.330 回答