所以我有一个看起来像这样的方法
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>'
这种行为甚至可能发生还是我做错了什么?
答案 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
方法应用相同的类型约束,则可以同时使用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>'
),可以通过将Schedule<T>
的相同约束应用于{ {1}}方法。
进一步阅读:Constraints on Type Parameters关于Microsoft Docs。