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

しかし、なぜ?

ボックス化されたものからにボックス化を解除しているためintですlong。これがジェネリックなしで失敗するのとまったく同じ方法で失敗します。

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

開箱変換、同じタイプ(モジュロ列挙型および符号付き/符号なし)に対して実行する必要があります。

于 2013-02-15T16:27:28.330 に答える