C#通用通配符

本文关键字:通配符 | 更新日期: 2023-09-27 18:29:58

我花了很多时间来解决这个问题,但我无法解决。我有以下Java方法签名:

public static <T> boolean isSameCollectionSets(
    Collection<? extends Collection<T>> set1, 
    Collection<? extends Collection<T>> set2)

这个方法采用两个T类型的集合。它在Java中工作。此外,编译器在传递正确的参数时能够自己获得类型T。

现在我想把这个完全相同的方法移植到C#。到目前为止,我有这个:

public static bool IsSameCollectionSets<T>(ICollection<T> set1, ICollection<T> set2) 
    where T : ICollection<T>

然而,当我尝试在C#中执行以下操作时,这会失败:

ICollection<List<int>> collection1 = new List<List<int>>();
ICollection<HashSet<int>> collection2 = new HashSet<HashSet<int>>();
var result = IsSameCollectionSets(collection1, collection2);

IsSameCollectionSets方法是带卷曲下划线的,编译器说:

"无法根据用法推断方法"bool IsSameCollectionSets(ICollection,ICollection)"的类型参数。请尝试显式指定类型参数。"

现在,我尝试明确地给出类型参数,但到目前为止没有任何作用。

我的错误在哪里?非常感谢!

C#通用通配符

多亏了@Rob,我找到了一个可行的解决方案。

我不使用ICollection<T>,而是使用IEnumerable<T>:

public static bool IsSameCollectionSets<T>(IEnumerable<IEnumerable<T>> set1,
IEnumerable<IEnumerable<T>> set2)

此外,与问题中的代码相比,我使用接口进行实例化:

ICollection<IList<int>> collection1 = new List<IList<int>>();
ICollection<ISet<int>> collection2 = new HashSet<ISet<int>>();