调用没有强制转换的子类型列表的方法

时间:2015-11-16 13:26:11

标签: c# list generics casting subtype

电话

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。 但有办法吗?或者它真的不可能,如果没有办法向你解释为什么这不起作用?

2 个答案:

答案 0 :(得分:2)

您需要使FuzzyCompareCollection方法采用IReadonlyList<T>类型的参数而不是List<T>。这将有效,因为与List<T>相比,IReadonlyList<T>是协变的。这意味着,SubSuper的子类型,IReadonlyList<Sub>是[{1}}的子类型,其中IReadonlyList<Super>不是List<Sub>的子类

答案 1 :(得分:0)

缺少的部分可能是:

public class SubClazz : SuperClazz

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