指数超出了范围.c#中的异常
本文关键字:异常 范围 指数 | 更新日期: 2023-09-27 18:10:09
我使用silverlight并使用c#代码进行序列化。我有一个parameters
类,里面我有parameter
和separator
列表:
[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类内部。我有参数类,如果我给参数类的字段分配任何值,它正在工作,但是当我去到参数类时,它有这个索引超出范围的错误。
如何解决这个问题?
索引超出范围,因为您有一个空数组。你不能从一个空数组中访问元素,因为它没有元素。
创建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]
等,但希望您能理解