使用不强制转换的子类型列表调用方法

本文关键字:类型 列表 调用 方法 转换 | 更新日期: 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>是协变的。这意味着给定SubSuper的子类型,IReadonlyList<Sub>IReadonlyList<Super>的子类型,其中List<Sub>不是List<Super>的子类。

缺少的部分可能是:

public class SubClazz : SuperClazz

此外,您不需要调用CastToList方法。