2016-02-05 2 views
0

(Это сообщение было отредактировано с большим количеством информации, потому что она должна была упрощена)заполнение массива в объекте в C#

Код ниже результатов в System.IndexOutOfRangeException: Индекс находился вне границ массива

, и я пытаюсь понять, почему это происходит.

Образец немного упрощен.

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.18020")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://iptc.org/std/SportsML/2008-04-01/")] 
[System.Xml.Serialization.XmlRootAttribute("team-metadata", Namespace = "http://iptc.org/std/SportsML/2008-04-01/", IsNullable = false)] 
public partial class teammetadata 
{ 

    private name[] nameField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("name")] 
    public name[] name 
    { 
     get 
     { 
      return this.nameField; 
     } 
     set 
     { 
      this.nameField = value; 
     } 
    } 
} 

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.18020")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://iptc.org/std/SportsML/2008-04-01/")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://iptc.org/std/SportsML/2008-04-01/", IsNullable = false)] 
public partial class name 
{ 
    private string fullField; 

    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string full 
    { 
     get 
     { 
      return this.fullField; 
     } 
     set 
     { 
      this.fullField = value; 
     } 
    } 
} 

пытается сделать это:

// Creating team meta data object 
var teamMetaData = new teammetadata[1]; 

// creating home team meta data 
var homeTeamMetaData = new teammetadata(); 

// Creating a new home team name 
var homeTeamName = new name[0]; 

// Creating the team name 
var teamName = new name { full = "Team name" }; 

homeTeamName[0] = teamName; // Ok 

homeTeamMetaData.name = new name[] { teamName }; // Causes exception 

homeTeamMetaData.name = homeTeamName; // Causes exception 

Я попробовал несколько различных подходов, но все заканчивается тем, что исключение.

Что я неправильно понял?

Ответ:

Как Патрик Хофман правильно указал, я садился homeTeamName пустого массива с размером равного нуля. В массивах вы установите начальный размер в 1, но при добавлении элементов запуска в положении 0.

Только в случае других спотыкается это так же, здесь очень простой пример, чтобы сказать, как массивы работают:

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     // Creating an array of strings which can hold up to two string objects 
     var arrayString = new string[2]; 

     // Creating the first string object 
     var stringItem1 = "Hello"; 

     // Adding the first string object to the array 
     arrayString[0] = stringItem1; 

     // Creating the second string object 
     var stringItem2 = "World!"; 

     // Adding the second string object to the array 
     arrayString[1] = stringItem2; 

     // Write the output... 
     Console.WriteLine(arrayString[0] + " " + arrayString[1]); 
    } 
} 

Этот пример можно найти здесь:

https://dotnetfiddle.net/JpJyDg

Опять же, спасибо за очень ценную обратную связь и помощь со стороны сообщества переполнением стека.

Тронд

+1

Вы можете показать определение класса 'bar'? – fubo

+0

Для меня этот код компилируется и работает просто отлично. Очевидно, вы слишком упростили свой код (за исключением того, что 'codeFoo [0]' не содержит какого-либо члена с именем 'bar'). – HimBromBeere

+0

Почему бы не использовать 'public bar [] barfield {get; set}'? – Aht

ответ

1

Проблема здесь:

// Creating a new home team name 
var homeTeamName = new name[0]; 

Вы не создаете новую команду, вы создаете пустой массив с размером, установленным в 0. Вы можете установить первый индекс (0), если массив пуст.

var homeTeamName = new name[1]; 

Это был бы лучший вариант.

+0

так очевидно, что я смотрел на него так много часов. Спасибо Патрику за это. – Trond

Смежные вопросы