【问题标题】:Why this case of generic type instantiation doesn't work?为什么这种泛型类型实例化的情况不起作用?
【发布时间】:2015-01-13 20:53:59
【问题描述】:

我编写了这个简化的代码来解释我面临的问题。我的问题在底部。

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 时,结果始终为 null。这是因为泛型类型 T 的实例化总是返回 null:

T 实例 = 新 T(); //->这就是问题所在,这每次都返回null

我尝试了不同的子类。我还尝试使用 Activator.CreateInstance() 而不是 new T()。但是在我从泛型类型 T 中删除 UnityEngine.Object 类约束之前,没有任何效果。像这样:

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

{...}

就在那时,一切都按预期进行。

所以,我的问题是:

当泛型类型被限制为 UnityEngine.Object 的子类时,为什么泛型类型的实例化(使用无参数构造函数)返回 null?

【问题讨论】:

  • 您的MySingleton 类型无法创建单例。根据定义,与它一起使用的每种类型都必须有一个公共构造函数,这意味着根据定义,您不能阻止创建多个实例。
  • 感谢您指出这一点。
  • C# new 运算符只能返回非null 值。请发布一个代码示例,显示您实际在做什么。见stackoverflow.com/help/mcve。 (Servy 的观点也是有效的,但如果我们摆脱你正在制作单例的想法,你似乎仍然有问题)。
  • 感谢塞尔维和彼得。我编写了新代码以使我的问题更清楚。我也测试了该代码,但问题仍然存在
  • @NadiaCibrikova:您可能应该将您的评论转换为答案。

标签: c# generics unity3d


【解决方案1】:

显然UnityEngine.Object 覆盖 == 运算符并假装为 null,即使它不是。见New UnityEngine.Object is Null 更多细节。 无论如何,它与泛型或 c# 无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 2017-11-25
    • 2020-12-02
    • 1970-01-01
    相关资源
    最近更新 更多