2015-01-12 147 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#无关。

相关问题