如何实现接受 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?
给定以下方法:
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?