猿问

使用 Method 的 Generic T 创建具有相同 Generic T 的另一个对象的新实例

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


public void Register<T>(TimeSpan interval, ILogger logger) where T : ISchedule

{

    _schedules.Add(new Schedule<T>(interval, logger));

}

我想用提供给 Register 方法的 T 创建一个新的 Schedule。


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>'


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


慕斯709654
浏览 128回答 1
1回答

PIPIONE

您还需要将where T : ISchedule, new()您在Schedule<T>类上指定的约束应用于该方法:Registerpublic 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>sinceSchedule2不包含无参数构造函数是非法的。如果我们不对方法应用相同的类型约束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>解决Register。
随时随地看视频慕课网APP
我要回答