为什么我不能在期望父类列表的函数中引用子类的列表?

时间:2018-01-19 17:13:17

标签: c#

public class A {
    public int ID {get;set;}
    public List<int> Things {get;set}
}

public class B : A {
    public string Name {get;set;}
}

public static FillListAThings(ref List<A> lstA){
 // ...
 // code to fill the Things list in each A of lstA with bulk call to database containing all A's IDs from lstA
 // ...
}

public static GetBList(){
  var lstB = new List<B>();

  // ...
  // Fill B list, get IDs and names
  // ...

  // ERROR here, since ref List<B> cannot be converted to a ref List<A>
  FillListAThings(ref lstB); 

}

我可以理解无法将ref List A传递给期望ref List B的函数,因为类中会缺少成员,但为什么这不可能呢?我也不能通过LINQ将它作为List A转换,因为它变成了一个无法引用的丢弃变量。

我目前的解决方法是转换为列表A的临时变量,将其发送到要填充的函数,然后通过交叉ID将属性复制回原始列表。

// workaround
var tmpListA = lstB.Cast<A>().ToList();
FillListAThings(ref tmpListA);
foreach(var b in lstB)
{
    var a = tmpListA.Where(x => x.ID == b.ID);
    // ... 
    // code to copy properties
    // ...
}

1 个答案:

答案 0 :(得分:3)

您可以,但是您需要扩大方法签名以接受实施List<T>的所有A类型,而不仅仅是List<A>本身。

public static void FillListAThings<T>(ref List<T> lstA) where T : A
{
    // ...
    // code to fill the Things list in each A of lstA with bulk call to database containing all A's IDs from lstA
    // ...
}