编译器不';我不认为C#类成员是一个列表

编译器不';我不认为C#类成员是一个列表,c#,list,C#,List,下面的代码尝试为具有成员列表的墙创建数据结构,这些成员还可以具有子成员列表。将子成员列表添加到成员的子成员列表字段时,我得到编译错误: 错误CS1503参数1:无法从“System.Collections.Generic.List”转换为“HeaderViewer.CurrentHeaders.WallSubcomponentMember”HeaderViewer 我想这意味着我正在尝试将WallSubcomponentMember类型的列表分配给一个WallSubcomponentMember

下面的代码尝试为具有成员列表的墙创建数据结构,这些成员还可以具有子成员列表。将子成员列表添加到成员的子成员列表字段时,我得到编译错误:

错误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;
    }
公共类墙
{
公共单壁;
公开名单成员;
}
公共类墙成员
{
公共单一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:我是