Member 14740628 Ответов: 2

Отображение индекса списка в текстовом поле


Эй все, нуб вопрос, но вот мы идем...

По разным причинам мне приходится переделывать инструмент, созданный в Unity, в Visual Studio. Я знаком с Unity C# и (вероятно, глупо) думал

"Ах, я могу кодировать в Visual Studio на C#... как это может быть трудно?"

В любом случае, это сводит меня с ума... У меня есть этот сценарий:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ToolCS
{
    public class TextContinuation
    {
        public static List<string> CurrentBuild = new List<string>();

        void OnStartup()
        {
            CurrentBuild.Add("v0.1.11f");
            CurrentBuild.Add("v0.1.12");
            CurrentBuild.Add("v0.1.13");
        }
    }
}


И я пытаюсь показать этот класс в текстовом поле, используя следующее:

txtVersion.Text = TextContinuation.CurrentBuild[0];


Но это дает мне ошибку:

System.ArgumentOutOfRangeException: 'Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index'


Этот метод раньше работал на меня, но я не знаю, не упускаю ли я что-то здесь. Он утверждает, что индекс находится вне диапазона?!

Любая помощь будет очень признательна!

Что я уже пробовал:

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

2 Ответов

Рейтинг:
12

OriginalGriff

Попробуйте изменить свой метод с этого момента:

void OnStartup()
        {
            CurrentBuild.Add("v0.1.11f");
            CurrentBuild.Add("v0.1.12");
            CurrentBuild.Add("v0.1.13");
        }

До настоящего времени:
public static TextContinuation()
        {
            CurrentBuild.Add("v0.1.11f");
            CurrentBuild.Add("v0.1.12");
            CurrentBuild.Add("v0.1.13");
        }

C# не вызывает автоматически метод "запуска": создание static конструктор для вашего класса означает, что static коллекция заполняется до того, как какой-либо экземпляр класса начинает ее использовать.


Member 14740628

Эй, спасибо, что перезвонили мне! Попробовал то, что ты предложил. Возвращается с проблемой: "модификаторы доступа не разрешены в статических конструкторах" :(

phil.o

Удалите "public" из объявления конструктора, и все будет в порядке :)

OriginalGriff

Слухи о моей смерти мозга подтвердились - просто уберите модификатор доступа "public" из определения.
Вы не можете получить доступ к статическим конструкторам напрямую, поэтому вы не можете указать, кто может получить к ним доступ, конечно.

phil.o

5 б.
Статические конструкторы не принимают модификаторы доступа, iirc (хотя в последнее время это могло измениться).

Member 14740628

Сработало как заклинание - спасибо, ребята x

Рейтинг:
0

phil.o

OnStartup метод в основном определяется в рамках Unity и автоматически вызывается при создании экземпляра при использовании в проекте Unity.

Когда вы создаете его в простом проекте Visual Studio, он ничем не вызывается. Таким образом, список никогда не заполняется и не содержит никаких элементов. Это объясняет ошибку, которую вы получаете при попытке получить доступ к первому элементу пустого списка.

Вы могли бы попробовать несколько вещей:
- позвонив в OnStartup метод из статического конструктора класса (но вам также придется объявить метод статическим).
- перемещение кода метода в статический конструктор класса.
- заполняйте список непосредственно после объявления.