为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕斯709654 2023-05-13 16:19:19
所以我有一个看起来像这样的方法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>'这种行为甚至可能还是我做错了什么?
查看完整描述

1 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

您还需要将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>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。



查看完整回答
反对 回复 2023-05-13
  • 1 回答
  • 0 关注
  • 93 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信