以下代码尝试为具有成员列表的墙创建数据结构,而这些成员可以进一步具有子成员列表。将子成员列表添加到成员的子成员列表字段时,出现编译错误:
错误CS1503参数1:无法从'System.Collections.Generic.List'转换为'HeaderViewer.CurrentHeaders.WallSubcomponentMember'HeaderViewer
[我认为这意味着我试图将类型为WallSubcomponentMember的列表分配给单个WallSubcomponentMember。但是我的WallMember类字段SCMembers是WallSubcomponentMember的列表。
为什么编译器认为SCMembers不是列表?
public class Wall
{
public Single WallNum;
public List<WallMember> Members;
}
public class WallMember
{
public Single MemId;
public List<WallSubcomponentMember> SCMembers;
}
public class WallSubcomponentMember
{
public Single MemId;
}
private List<Wall> TestData ()
{
var wallList = new List<Wall>();
var Member1 = new WallMember
{ MemId = 1 };
var SubcomponentMember1 = new WallSubcomponentMember
{ MemId = 1 };
var SubcomponentMember2 = new WallSubcomponentMember
{ MemId = 2 };
var subcomponentMemberList = new List<WallSubcomponentMember>();
subcomponentMemberList.Add(SubcomponentMember1);
subcomponentMemberList.Add(SubcomponentMember2);
Member1.SCMembers.Add(subcomponentMemberList);
var memberList = new List<WallMember>();
memberList.Add(Member1);
var aWall = new Wall
{
WallNum = 1,
Members = memberList
};
wallList.Add(aWall);
return wallList;
}
[我认为这意味着我正在尝试将类型为WallSubcomponentMember的列表分配给单个WallSubcomponentMember。
非常接近。再次阅读错误消息:
Argument 1: cannot convert
尽管这是一个赋值-具体地说,它是对形式参数的赋值-您最好将其视为失败的转换。许多转换归因于分配,但重要的是转换。
但是我的WallMember类字段SCMembers是WallSubcomponentMember的列表。
正确。
为什么编译器认为SCMembers不是列表?
无法回答该问题,因为它做出了错误的假设。编译器确实认为SCMembers
是一个列表。实际上,如果不能,它将不会给出错误!
再次,查看错误消息。 仔细阅读错误消息会在将来带来收益。错误出现在参数1上。在该行中:
Member1.SCMembers.Add(subcomponentMemberList);
只有一件事可能是“参数一”,那就是subcomponentMemberList
。然后,我们查找Add
的文档,发现在List<T>
中,Add
方法采用T
,而不是List<T>
。现在,错误消息应该变得有意义了。 List<WallSubcomponentMember>.Add
取一个WallSubcomponentMember
,但您传递了一个List<WallSubcomponentMember>
,并且没有从传递的内容转换为Add
所需的内容,因此第一个(也是唯一一个)参数给出了错误消息。 >
您可能想调用AddRange
,它将一个列表的内容添加到另一个列表。也就是说,查看您的代码尚不清楚为什么您要创建一个辅助列表。为什么不直接将子组件直接添加到最终目的地?您永远不会再使用subcomponentMemberList
,因此它似乎对没有什么特别有用。