编译器不';我不认为C#类成员是一个列表
下面的代码尝试为具有成员列表的墙创建数据结构,这些成员还可以具有子成员列表。将子成员列表添加到成员的子成员列表字段时,我得到编译错误: 错误CS1503参数1:无法从“System.Collections.Generic.List”转换为“HeaderViewer.CurrentHeaders.WallSubcomponentMember”HeaderViewer 我想这意味着我正在尝试将WallSubcomponentMember类型的列表分配给一个WallSubcomponentMember。但是我的WallMember类字段SCMembers是WallSubcomponentMember的列表 为什么编译器认为SCMembers不是一个列表编译器不';我不认为C#类成员是一个列表,c#,list,C#,List,下面的代码尝试为具有成员列表的墙创建数据结构,这些成员还可以具有子成员列表。将子成员列表添加到成员的子成员列表字段时,我得到编译错误: 错误CS1503参数1:无法从“System.Collections.Generic.List”转换为“HeaderViewer.CurrentHeaders.WallSubcomponentMember”HeaderViewer 我想这意味着我正在尝试将WallSubcomponentMember类型的列表分配给一个WallSubcomponentMember
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;
}
公共类墙
{
公共单壁;
公开名单成员;
}
公共类墙成员
{
公共单一MemId;
公开名单成员;
}
公共类WallSubcomponentMember
{
公共单一MemId;
}
私有列表TestData()
{
var wallList=新列表();
var Member1=新墙成员
{MemId=1};
var SubcomponentMember1=新墙SubComponentMember
{MemId=1};
var SubcomponentMember2=新墙SubComponentMember
{MemId=2};
var subcomponentMemberList=新列表();
subcomponentMemberList.Add(SubcomponentMember1);
subcomponentMemberList.Add(SubcomponentMember2);
Member1.SCMembers.Add(子组件成员列表);
var memberList=新列表();
成员列表。添加(成员1);
var aWall=新墙
{
WallNum=1,
成员=成员列表
};
墙列表。添加(aWall);
返回墙列表;
}
我想这意味着我正在尝试将WallSubcomponentMember类型的列表分配给一个WallSubcomponentMember
非常接近。再次阅读错误消息:
Argument 1: cannot convert
虽然这是一个赋值——特别是对形式参数的赋值——但最好将其视为失败的转换。许多转换是由于分配,但重要的是转换
但是我的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;
}
这个问题无法回答,因为它作出了错误的假设。编译器确实认为SCMembers
是一个列表;事实上,如果不能,它不会给出错误
再次查看错误消息仔细阅读错误消息将在将来获得回报。错误在参数1上。行中:
Member1.SCMembers.Add(subcomponentMemberList);
只有一件事可以是“参数一”,那就是子组件成员列表
。然后我们查找Add
的文档,发现在列表中,Add
方法采用T
,而不是List
。现在错误消息应该有意义了List.Add
接受一个WallSubcomponentMember
,但是您传递了一个List
,并且没有将您传递的内容转换为Add
需要的内容,因此在第一个(也是唯一的)参数上给出了一条错误消息
您可能打算调用AddRange
,将一个列表的内容添加到另一个列表中。也就是说,看看你的代码,你根本不清楚为什么要创建一个辅助列表;为什么不直接将子组件添加到最终目的地?您再也不会使用子组件成员列表
,因此它似乎没有什么特别的用处
当我们查看您的代码时:现在就摆脱公开字段的习惯;他们在C#中的做法很糟糕。如果您打算拥有公共字段,请将其改为公共属性:
public Single WallNum { get; set; }
然后考虑该属性是否需要读写;我的首选是创建只读属性或只能由包含类编写的属性:
public Single WallNum { get; private set; }
例如。它并不认为SCMembers
不是一个列表。问题是您正试图将列表添加到列表中。您是否打算将子组件成员1
和子组件成员2
直接添加到成员1.SCMembers
?或者,由于SCMembers
是一个字段,而不是一个get
-only属性,您也可以只执行Member1.SCMembers=subcomponentMemberList
,但我不建议这样做。如果是我,我会在Wall
中添加add(WallMember)
,在WallMember
中添加add(WallSubcomponentMember)
。我也会让他们实现适当的IEnumerable接口。这样,它可以简化代码,还允许您使用集合初始化语法(如果您完全正确的话)。我很好奇为什么您要使用Single
作为标识符;通常我们会使用int
来实现这一点。在这里使用单精度实数的目的是什么?我认为int不够大,无法处理我相当大的id号,但在检查int之后确实是一种方法。谢谢一旦我开始工作,还有很多重构要做。谢谢!我想我现在就去申请卡车司机学校。天啊,我应该看到的。我当然不需要辅助列表。感谢您提醒有关公共字段的信息。我的实际代码范围正确(我认为)@基拉凯斯:很高兴你明白了。不要对自己太苛刻;很难看出问题所在。有一个论点是,如果你不能从错误信息中理解问题,那么错误就在于错误信息;错误消息往往是由专家程序员设计的,他们根据规范来表达错误,而不是按照教开发人员如何理解问题的方式来表达错误。@Killakeys:我是