C# 为什么可以';我在一个需要父类列表的函数中引用子类列表吗? 公共A类{ 公共int ID{get;set;} 公共列表事物{get;set} } B级:A级{ 公共字符串名称{get;set;} } 公共静态填充(参考列表lstA){ // ... //使用对包含来自lstA的所有A ID的数据库的批量调用来填充lstA每个A中的内容列表的代码 // ... } 公共静态GetBList(){ var lstB=新列表(); // ... //填写B列表,获取ID和姓名 // ... //此处出错,因为ref列表无法转换为ref列表 填充物(参考lstB); }

C# 为什么可以';我在一个需要父类列表的函数中引用子类列表吗? 公共A类{ 公共int ID{get;set;} 公共列表事物{get;set} } B级:A级{ 公共字符串名称{get;set;} } 公共静态填充(参考列表lstA){ // ... //使用对包含来自lstA的所有A ID的数据库的批量调用来填充lstA每个A中的内容列表的代码 // ... } 公共静态GetBList(){ var lstB=新列表(); // ... //填写B列表,获取ID和姓名 // ... //此处出错,因为ref列表无法转换为ref列表 填充物(参考lstB); },c#,C#,我可以理解不能将ref列表a传递给期望ref列表B的函数,因为类中会缺少成员,但是为什么这不可能呢?我也不能通过LINQ将其转换为列表A,因为它变成了一个不能被引用的一次性变量 我当前的解决方法是强制转换为列表a的临时变量,将其发送给要填充的函数,然后通过在属性ID上交叉将属性复制回原始列表 public class A { public int ID {get;set;} public List<int> Things {get;set} } public cla

我可以理解不能将ref列表a传递给期望ref列表B的函数,因为类中会缺少成员,但是为什么这不可能呢?我也不能通过LINQ将其转换为列表A,因为它变成了一个不能被引用的一次性变量

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

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); 

}
//解决方法
var tmpListA=lstB.Cast().ToList();
填充物(参考tmpListA);
foreach(lstB中的变量b)
{
var a=tmpListA.Where(x=>x.ID==b.ID);
// ... 
//复制属性的代码
// ...
}

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

// 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
    // ...
}
公共静态无效填充列表(参考列表lstA),其中T:A
{
// ...
//使用对包含来自lstA的所有A ID的数据库的批量调用来填充lstA每个A中的内容列表的代码
// ...
}

我不这么认为,因为我希望引用它。该问题的答案是“这将强制转换列表中的每个项目,而不是列表本身。通过调用ToList(),将创建一个新列表。”原因是co/contrance。链接问题的第二个答案解释了这一点。第一个答案只是解释了解决方法。这有助于我更好地理解这个问题,但夜猫子888的答案绝对是我想要的。谢谢你的帮助!
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
    // ...
}