所以我有一个看起来像这样的方法
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
方法应用相同类型的约束,我们可以同时使用Schedule1
和Schedule2
调用该方法。由于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文档类型参数的约束。