如何实现接受 ICollection<T> 和 ICollection<T?> 的方法

How to implement method accepting ICollection<T> and ICollection<T?>

给定以下方法:

public static void DisposeItems<T>(this ICollection<T?> collection)
    where T : class, IDisposable
{
    foreach (var item in collection)
    {
        item?.Dispose();
    }

    if (!collection.IsReadOnly)
    {
        collection.Clear();
    }
}

这被称为:

private static void CleanupNullable(List<TestClass?> collection)
{
    collection.DisposeItems();
}

private static void Cleanup(List<TestClass> collection)
{
    collection.DisposeItems();
}

第二个报错: 由于引用类型中的可空性差异,无法使用集合

接受 IEnumerable<T?> 的类似实现工作正常,因为 IEnumerable 是协变的。

我无法创建接受 ICollection<T> 的附加方法,因为可为空性不是签名的一部分。有什么方法可以编译它,因为它可以预空性吗?

删除 class 约束或将其更改为 class? 会在使用 Collection<TestClass?> 调用它时产生错误,因为 TestClass? 与约束 IDisposable 不匹配。

这是因为你把问号放错了地方。如果您的 generic constraint 不关心类型是否可为空,则将问号添加到 where 表达式中的类型,而不是参数列表。另外,您需要为该类型的所有约束添加“无关”问号。

public static void DisposeItems<T>(this ICollection<T> collection)
    where T : class?, IDisposable?