【问题标题】:How to create an instance with generics?如何使用泛型创建实例?
【发布时间】:2015-07-30 14:21:53
【问题描述】:

我正在尝试做一些简单的事情:使用泛型创建一个实例。我收到一条错误消息,提示我无法创建实例,因为我没有 new 约束。但是,我的退货声明中确实有它!有什么想法吗?

public IAction CreateAction<TA, TP>(ActionParamBase param)
            where TA : IAction
            where TP : ActionParamBase
        {
            Ensure.That(param).Is<TP>();

            return new TA { Param = param as TP };
        }

【问题讨论】:

  • 你需要这样做: where TA : class, new() Check: stackoverflow.com/questions/4737970/…
  • TA 是一个通用接口.. 你不能创建接口的实例
  • 好的,谢谢你们的帮助!有效! => 其中 TA : IAction, new()

标签: c# generics


【解决方案1】:

您必须在TA 类型参数上指定new() 约束才能调用构造函数:

public IAction CreateAction<TA, TP>(ActionParamBase param)
        where TA : IAction
                 , new()
        where TP : ActionParamBase
    {
        ...
    }

只有这样它才知道(并强制)TA 有一个无参数的构造函数。

(请注意:它仅适用于无参数构造函数,不适用于有参数的构造函数。在这种情况下,您可以使用初始化程序)

【讨论】:

    【解决方案2】:

    这意味着new 在您的 TA 部分的约束中。请参阅此 SO 帖子以供参考,然后查看以下代码: Passing arguments to C# generic new() of templated type

    public IAction CreateAction<TA, TP>(ActionParamBase param)
            where TA : IAction, new()
            where TP : ActionParamBase
        {
            Ensure.That(param).Is<TP>();
    
            return new TA { Param = param as TP };
        }
    

    【讨论】:

    • 它在抱怨TA,而不是TP
    • 是的,很抱歉,我最初输入时打错了;)
    猜你喜欢
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    相关资源
    最近更新 更多