“索引超出范围”c#中的异常

时间:2014-06-25 12:10:39

标签: c# .net xml xml-serialization xmlwriter

我使用silverlight并使用c#代码进行序列化。 我有一个parameters课程,里面有parameterseparator个列表:

[XmlRoot(ElementName = "parameters")]
    public class Parameters
    {       
       [XmlElement("separator")]
       public List<Separator> Separator { get { return a1; } }
       private readonly List<Separator> a1 = new List<Separator>(); 

       [XmlElement("parameter")]
       public List<Parameter> Parameter { get { return b1; } }
       private readonly List<Parameter> b1 = new List<Parameter>();
    }

再次在Parameter类中我有:

[XmlElement("name")]
        public string Name { get; set; }

还有:

[XmlElement("component")]
        public List<Component> Component { get { return b3; } }
        private readonly List<Component> b3 = new List<Component>();

等等。

现在我在主函数中使用XmlWriter:

public void Main()
{
           Parameters[] prs = new Parameters[4];
           prs[0] = new Parameters();
           prs[1] = new Parameters();
           prs[2] = new Parameters(); 

           prs[0].Parameter[0].Name = "shek1";
           prs[0].Parameter[0].Component[0].Type = "type1";

           prs[1].Separator[0].Separators = "sep1";

           prs[2].Parameter[0].Name = "shek2";
           prs[2].Parameter[0].Component[0].Type = "type2";

StringBuilder output = new StringBuilder();
            XmlWriterSettings ws = new XmlWriterSettings();
            ws.Indent = true;
            using (XmlWriter writer = XmlWriter.Create(output, ws))
           {
               writer.WriteStartDocument();
               writer.WriteStartElement("Parameters");
               int count = 0;
              foreach (var param in prs)
               {
                   writer.WriteStartElement("Parameter");
                   writer.WriteElementString("Name", param.Parameter[count].Name);
                   writer.WriteStartElement("Component");
                   writer.WriteElementString("Type", param.Parameter[count].Component[0].Type);
                   writer.WriteStartElement("Attribute");
                   writer.WriteElementString("Items", param.Parameter[count].Component[0].Attributes[0].Items[count]);
                   writer.WriteEndElement(); 
              }
              writer.WriteEndElement();
              writer.WriteEndDocument();
           }  
}

我遇到的错误是Index was out of range. It must not be negative and must be less than the size of the collection.prs[0].Parameter[0].Name = "shek1";我知道问题出在Parameters类中。我有Parameter类,如果我将任何值赋给Parameters类的字段,它会工作,但是当我转到Parameter类时,它的索引超出范围错误。

如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

索引超出范围,因为你有一个空数组。并且您无法从空数组中访问元素,因为它没有元素。

在这里,您可以创建Parameters个对象的数组:

Parameters[] prs = new Parameters[4];
prs[0] = new Parameters();
prs[1] = new Parameters();
prs[2] = new Parameters(); 

此时你有一个4个元素的Parameters个数组,其中3个有一个有效的Parameters个对象(由于某些原因,第4个为空)。现在每个Parameters对象都有一个Parameter属性(顺便说一句,这让我感到很困惑,我建议使用更好的类型/变量命名):

public List<Parameter> Parameter { get { return b1; } }
private readonly List<Parameter> b1 = new List<Parameter>();

所以Parameter属性是new List<Parameter>(),这是一个空列表。然后,您尝试从空列表中访问元素:

prs[0].Parameter[0].Name = "shek1";

prs[0]Parameter个对象,但.Parameter为空List<Parameter>。它在索引0没有元素。因此错误。

如果您需要初始化List<Parameter>对象中的Parameter,那么就可以像创建Parameter数组时那样在该对象中执行此操作。或者你可以在你使用它的地方添加一个:

prs[0].Parameter.Add(new Parameter());
prs[0].Parameter[0].Name = "shek1";

答案 1 :(得分:1)

这是因为当您调用prs[0].Parameter[0].Name = "shek1";时,Parameter属性是一个空列表(private readonly List<Parameter> b1 = new List<Parameter>();),因此是一个列表但包含零元素。

您需要先添加一个元素,然后分配如下名称:

prs[0].Parameter.Add(new Parameter());
prs[0].Parameter[0].Name = "shek1";
prs[0].Parameter[0].Component[0].Type = "type1";

或者简化为:

prs[0].Parameter.Add(new Parameter
    { 
        Name = "shek1",
        Type = "type1"
    });

您需要对其他来电重复此操作,因此要prs[1]prs[2]等,但希望您明白这一点。