2012-03-14 73 views
2

我已經創建了一個動態方法來創建一個不同類型的實例,但不知道它爲什麼在編譯時給出上述錯誤,還必須再次將返回值轉換爲指定類型?GetInstance <T>()'不能從使用情況推斷。嘗試明確指定類型參數

internal static T GetInstance<T>() 
    { 
     dynamic obj = Activator.CreateInstance(typeof(T)); 
     return obj; 
    } 

    private Foo f = GetInstance<Foo>(); 
+1

爲什麼「動態」?你可能只需要'return(T)Activator.CreateInstance(typeof(T));'但是錯誤來自哪裏 - 你的函數?這是調用它的線? – Rup 2012-03-14 11:46:47

+0

好問題,其實我也必須設置其他屬性 – BreakHead 2012-03-14 11:49:23

+0

它在編譯時發出錯誤 – BreakHead 2012-03-14 11:49:59

回答

7

你爲什麼不只是使用MSDN建議是什麼,它是這樣的:

internal static T GetInstance<T>() where T:new() 
{ 
    return new T(); 
} 

http://msdn.microsoft.com/en-us/library/0hcyx2kd.aspx

編輯:

雖然,我不明白你爲什麼甚至想要有這個方法?

與其說var x = GetInstance<Foo>();的,你可以只是做var x = new Foo();因爲如果你想與FooGetInstance<T>()作爲類型參數的Foo必須有參數的構造函數(還是我失去了一些東西?)。

+0

感謝Jaaco +1,但爲什麼Where T:new()? – BreakHead 2012-03-14 11:58:16

+0

更快且相同 - CreateInstance可以做動態參數,但是當你不通過它們時,cna不會這樣做,那麼新的作品比createisntance更好 - 更強的競價。 – TomTom 2012-03-14 12:00:47

+0

@BreakHead它是Jaakko :)如果沒有「new()」約束,那麼您將無法執行「new T()」。所有這些約束都會保證'T'具有無參數的構造函數。 – flai 2012-03-14 12:01:06

相關問題