指数超出了范围.c#中的异常

本文关键字:异常 范围 指数 | 更新日期: 2023-09-27 18:10:09

我使用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();
           }  
}

我得到的错误是prs[0].Parameter[0].Name = "shek1";行的Index was out of range. It must not be negative and must be less than the size of the collection.我知道问题在Parameters类内部。我有参数类,如果我给参数类的字段分配任何值,它正在工作,但是当我去到参数类时,它有这个索引超出范围的错误。

如何解决这个问题?

指数超出了范围.c#中的异常

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

创建Parameters对象数组:

Parameters[] prs = new Parameters[4];
prs[0] = new Parameters();
prs[1] = new Parameters();
prs[2] = new Parameters(); 
此时,您有一个包含4个元素的Parameters es数组,其中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处没有元素。因此出现了错误。

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

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

这是因为当您调用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]等,但希望您能理解