使用方法的通用T创建具有相同通用T的另一个对象的新实例

时间:2019-06-28 10:41:00

标签: c# generics

所以我有一个看起来像这样的方法

public void Register<T>(TimeSpan interval, ILogger logger) where T : ISchedule
{
    _schedules.Add(new Schedule<T>(interval, logger));
}

我想使用提供给Register方法的T创建一个新的时间表。

internal class Schedule<T> : IDisposable where T : ISchedule, new() {}

在这里,我遇到以下错误: 'T' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'Schedule<T>'

这种行为甚至可能发生还是我做错了什么?

1 个答案:

答案 0 :(得分:2)

您还需要将在where T : ISchedule, new()类上指定的Schedule<T>约束也应用于Register方法:

public void Register<T>(TimeSpan interval, ILogger logger) where T : ISchedule, new()
{
    _schedules.Add(new Schedule<T>(interval, logger));
}

请考虑以下两个实现ISchedule接口的类。

public class Schedule1 : ISchedule
{
    public Schedule1() { }
}

public class Schedule2 : ISchedule
{
    public Schedule2(string foo) { }
}

Schedule<T>类具有通用类型约束where T : ISchedule, new(),这意味着仅那些实现ISchedule包含无参数构造函数的类型可用作类型参数。因此,指定Schedule<Schedule2>是非法的,因为Schedule2不包含无参数构造函数。

如果我们不对Register方法应用相同的类型约束,则可以同时使用Schedule1Schedule2来调用该方法。由于Schedule2不符合Schedule<T>的类型约束,因此我们现在有一个问题('T' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'Schedule<T>'),可以通过将Schedule<T>的相同约束应用于{ {1}}方法。


进一步阅读:Constraints on Type Parameters关于Microsoft Docs。