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

C# 如何实现接受ICollection的方法<;T>;和ICollection<;T?>;,c#,nullability,C#,Nullability,根据以下方法: public static void DisposeItems<T>(this ICollection<T?> collection) where T : class, IDisposable { foreach (var item in collection) { item?.Dispose(); } if (!collection.IsReadOnly) { collec

根据以下方法:

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();
    }
}
publicstaticvoiddisposeItems(此ICollection集合)
其中T:类,IDisposable
{
foreach(集合中的var项)
{
项目?.Dispose();
}
如果(!collection.IsReadOnly)
{
collection.Clear();
}
}
这被称为:

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

private static void Cleanup(List<TestClass> collection)
{
    collection.DisposeItems();
}
private static void CleanupNullable(列表集合)
{
collection.DisposeItems();
}
专用静态无效清除(列表集合)
{
collection.DisposeItems();
}
第二个给出了错误: 集合无法使用,因为引用类型中的可空性不同

一个接受
IEnumerable
的类似实现可以正常工作,因为
IEnumerable
是共同变量

我无法创建接受ICollection的附加方法,因为可空性不是签名的一部分。有什么方法可以编译它,因为它在可空性之前工作


删除
class
约束或将其更改为
class?
在使用
Collection
调用时会出现错误,因为
TestClass?
与约束
IDisposable

不匹配这是因为您将问号放在了错误的位置。如果您不关心某个类型是否可为null,则可以在where表达式中向该类型添加问号,而不是在参数列表中添加问号。另外,您需要在该类型的所有约束中添加“不在乎”问号

publicstaticvoiddisposeItems(此ICollection集合)
T:class?在哪里,可识别?

首先,由于空运算符,它无法编译。你怎么能像你提到的那样调用它呢
在使用Collection调用它时会出错
?我通过使用
#nullable disable
#nullable restore
来实现它。现在的情况和以前一样。它允许从具有非Null和Null类型的可Null上下文调用。我希望有另一种方法。显示的代码适用于收集,但不适用于收集。您如何称呼此方法?谢谢,我从未想过在
IDisposable
之后添加“问号”。