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



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

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

我想使用提供给注册方法的 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>'

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

您还需要将对Schedule<T>类指定的where T : ISchedule, new()约束应用于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>'),可以通过对Register方法应用相同的Schedule<T>约束来解决。


延伸阅读:Microsoft文档类型参数的约束。

最新更新