c# - 使用 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>'
这种行为甚至可能还是我做错了什么?
解决方案
您还需要将在类上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
调用该方法。由于不符合的类型约束,我们现在有一个问题 ( ),可以通过对方法应用相同的约束来解决。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
进一步阅读:Microsoft Docs上类型参数的约束。
推荐阅读
- r - 如何通过ggplot2中的交互以特定顺序重新排序箱线图
- r - 如何将向量中的其余变量设置为零而不单独定义每个变量
- mapbox - 单个 Mapbox Vector Tile 的预期大小(以像素为单位)是多少?
- google-chrome - 赛普拉斯无法在无头 Chrome 中打开弹出窗口
- php - PHP PDO 未从 MSSQL 存储过程调用中找到 OUTPUT 参数
- php - 刷新页面后无法停止页面浏览量的增加
- laravel - 在 Laravel Blade 中访问 JSON 数组
- tableau-api - 应用过滤器的总变化百分比
- java - 为什么 -classpath 找不到我的 Jsoup jar 文件?
- python - conf.py 中的 setup(app) 有什么用?