使用不强制转换的子类型列表调用方法
本文关键字:类型 列表 调用 方法 转换 | 更新日期: 2023-09-27 18:22:08
The Call
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,因为列表包含 SuperClazz 的子类型。但是有办法吗?还是真的不可能,如果没有办法向我解释为什么这行不通?
您需要
使FuzzyCompareCollection
方法采用类型为IReadonlyList<T>
而不是List<T>
的参数。这是有效的,因为与List<T>
相反,IReadonlyList<T>
是协变的。这意味着给定Sub
是Super
的子类型,IReadonlyList<Sub>
是IReadonlyList<Super>
的子类型,其中List<Sub>
不是List<Super>
的子类。
缺少的部分可能是:
public class SubClazz : SuperClazz
此外,您不需要调用Cast
和ToList
方法。