2015-01-12 191 views
0

我寫了這個簡化的代碼來解釋我面臨的問題。我的問題在底部。爲什麼這種泛型類型實例化不起作用?

public abstract class Creator<T> : UnityEngine.Object 
where T :UnityEngine.Object, new() 
{ 
    public static T CreateInstance() 
    { 
     T instance = new T(); // -> Here's the issue! always null 

     return instance; 
    } 
} 

public class ConcreteCreator : Creator<ConcreteCreator> 
{ 
} 

每當我調用CreateInstance時,結果總是爲空。這是因爲泛型類型T的實例化始終返回null:

T instance = new T(); // - >這是問題所在,每次都返回空值

我試過不同的子類。我也嘗試使用Activator.CreateInstance()而不是新的T()。但是沒有任何工作,直到我從通用類型T中刪除UnityEngine.Object類約束。像這樣:

public abstract class Creator<T> : UnityEngine.Object where T : new() 

{...} 

就在這時,一切都按預期工作。

所以,我的問題是:

爲什麼泛型類型(使用參數的構造函數)返回null的實例,當類型被約束爲UnityEngine.Object的子類?

+4

您的MySingleton類型無法創建單例。每個與它一起使用的類型都必須定義一個公共構造函數,這意味着根據定義,您不能阻止創建多個實例。 – Servy

+0

謝謝你指出。 – Lio

+1

C#'new'運算符只能返回一個非'null'值。請發佈代碼示例,顯示您實際在做什麼。請參閱https://stackoverflow.com/help/mcve。 (塞維的觀點也是有效的,但是如果我們擺脫了單身的想法,你似乎仍然有問題)。 –

回答

0

顯然UnityEngine.Object覆蓋 ==運算符並假裝爲空,即使它不是。有關更多詳細信息,請參閱New UnityEngine.Object is Null 。 在任何情況下,它與泛型或c#無關。

相關問題