编译器无法将C#类成员识别为列表

问题描述 投票:0回答:1

以下代码尝试为具有成员列表的墙创建数据结构,而这些成员可以进一步具有子成员列表。将子成员列表添加到成员的子成员列表字段时,出现编译错误:

错误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;
    }
c# list
1个回答
1
投票

[我认为这意味着我正在尝试将类型为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,因此它似乎对没有什么特别有用。

© www.soinside.com 2019 - 2024. All rights reserved.