电话
List<SubClazz> subList1 = new List<SubClazz>();
List<SubClazz> subList2 = new List<SubClazz>();
FuzzyCompareCollection(subList1,subList2); //Compile Error
我怎么做呢
FuzzyCompareCollection(subList1.Cast<SuperClazz>().ToList(),subList2.Cast<SuperClazz>().ToList());
方法定义
public static bool FuzzyCompareCollection<T>(List<T> list1, List<T> list2) where T : SuperClazz
{
if (list1.Count != list2.Count)
{
return false;
}
Dictionary<string, SuperClazz> dict1 = new Dictionary<string, SuperClazz>();
Dictionary<string, SuperClazz> dict2 = new Dictionary<string, SuperClazz>();
foreach (T item in list1)
{
dict1[item.ID] = item; //ID is an attribute of SuperClazz
}
foreach (T item in list2)
{
dict2[item.ID] = item;
}
bool equals = true;
foreach (string key in dict1.Keys)
{
try
{
equals = Util.ReflectiveEquals(dict1[key], dict2[key]);
if (!equals)
{
break;
}
}
catch (KeyNotFoundException e)
{
return false;
}
}
return equals;
}
我认为我应该能够调用该方法而不进行强制转换,因此SuperClazz因为Lists包含SuperClazz的SubTypes。 但有办法吗?或者它真的不可能,如果没有办法向你解释为什么这不起作用?
答案 0 :(得分:2)
您需要使FuzzyCompareCollection
方法采用IReadonlyList<T>
类型的参数而不是List<T>
。这将有效,因为与List<T>
相比,IReadonlyList<T>
是协变的。这意味着,Sub
是Super
的子类型,IReadonlyList<Sub>
是[{1}}的子类型,其中IReadonlyList<Super>
不是List<Sub>
的子类
答案 1 :(得分:0)
缺少的部分可能是:
public class SubClazz : SuperClazz
此外,您不需要调用Cast
和ToList
方法。