首页 > 解决方案 > 使用 Method 的 Generic T 创建具有相同 Generic 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>'

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

标签: c#generics

解决方案


您还需要将在类上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包含无参数构造函数的类型才能用作类型参数。因此,指定 a 是非法的,Schedule<Schedule2>因为Schedule2它不包含无参数构造函数。

如果我们不对方法应用相同的类型约束,我们可以同时使用andRegister调用该方法。由于不符合的类型约束,我们现在有一个问题 ( ),可以通过对方法应用相同的约束来解决。Schedule1Schedule2Schedule2Schedule<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


进一步阅读:Microsoft Docs上类型参数的约束。


推荐阅读