2013-02-15 45 views
1

我有以下源:InvalidCastException的在通用方法

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

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

所以常數0是一個Int32並且必須被轉換爲一個Int64在通用方法GetValue。 但這會導致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); 
    } 

回答

6

但是爲什麼?

因爲您正在從盒裝int拆箱到long。它未能在完全相同的方式,這將失敗,並沒有仿製藥:

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

拆箱轉換做同一類型(模枚舉和符號/無符號)。

+0

請將此標記爲答案;因爲它是。 – Brian 2013-02-15 16:36:43

+0

非常感謝。現在我使用動態而不是對象,它的工作原理。 – Chris 2013-02-15 17:56:13

+1

@Chris:不,不要使用'dynamic'來解決這個問題。在Jon的例子中,你可以使用'long unboxed =(long)(int)boxed; //成功!「Eric Lippert的優秀解釋:http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx – Brian 2013-02-15 19:41:30

相關問題