Могу ли я получить и установить массив в C#?


ВОПРОС ДОМАШНЕГО ЗАДАНИЯ: Мне нужно создать простую викторину, которая читает из CSV-файла. Мои данные для конкретного вопроса структурированы следующим образом:"Question;AnswerA;AnswerB;AnswerC;AnswerD;CorrectAnswerLetter".

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

В моем конструкторе я использую этот код-который я считаю создает экземпляр массива ответов в вопросе:

class TriviaQuestionUnit
{
    ...

    const int NUM_ANSWERS = 4;
    string[] m_Answers = new String[NUM_ANSWERS];

    public string[] Answer
    {
        get { return m_Answers[]; }
        set { m_Answers = value[];
    }

    ...

    // Answer array
    public string[] GETAnswer(int index) 
    {
        return m_Questions[index].Answer;
    }

    ...
}

Я обращаюсь к геттеру и сеттеру из моего метода TriviaQuestionBank, который включает в себя этот код:

...

const int NUM_QUESTIONS = 15;
TriviaQuestionUnit[] m_Questions = new TriviaQuestionUnit[NUM_QUESTIONS];

...

// Answer array
public string[] GETAnswer(int index) 
{
    return m_Questions[index].Answer;
}

...

Я использую using StreamReader для чтения строки ввода из моего файла

...

char delim = ';'; 
String[] inputValues = inputText.Split(delim); 

...

Анализирует входные данные в массиве, из которого я создаю данные вопроса. Для моих четырех ответов, проиндексированных от 1 до 4 в массиве inputValues, я заполняю массив этого вопроса четырьмя ответами.

...

for (int i = 0; i < NUM_ANSWERS; i++)                                      
{
    m_Questions[questionCounter].Answer[i] = inputValues[i + 1];    
}

...

Я получаю ошибки Syntax code, value expected на геттерах / сеттерах в моем конструкторе, и если я изменяю переменную на m_Answers[NUM_QUESTIONS], я получаю ошибку, что я can't implicitly convert string to String[].

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

1 4

1 ответ:

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

Вы говорите "в моем конструкторе", но проблема в том, что ваш код не имеет конструктор. Однако вы инициализируете поля и свойства в своем классе, и, конечно же, компилятор создаст конструктор по умолчанию для вас, но вы не определили его самостоятельно. Я не говорю, что ваш код не работает, потому что у вас нет конструктора, но вы можете использовать неправильные термины.

Первая проблема заключается в вашем первом фрагменте кода внутри TriviaQuestionUnit. Ваши первые две строки работают правильно, вы создаете постоянное целое число со значением 4, которое вы используете чтобы определить, насколько большим будет Ваш массив, а затем вы инициализируете массив с этим заданным числом.

Когда вы сделаете new string[NUM_ANSWERS] , это создаст массив со значениями по умолчанию (пустыми) .

Первая проблема, которая возникает в вашем коде, - это геттеры и сеттеры. Свойство ожидает, что вы вернете массив строк, который сигнатура метода фактически сообщает нам:

public string[] Answer

Однако, глядя на добытчика и сеттера, что это такое, что вы вернуться?

m_Answers является "ссылкой" на Ваш массив, следовательно, всякий раз, когда вы пишете m_Answers, Вы ссылаетесь на этот массив. Так что же происходит, когда мы добавляем квадратные скобки?

Добавление [] после имени переменной массива указывает на то, что мы хотим получить значение из массива. Это называется индексатором, мы предоставляем ему индекс, где мы хотим получить значение из массива (первое значение начинается с индекса 0). Однако, вы не снабжаете его ценностью? Так что же возвращается?

Слушайте компилятор!

Indexer has 1 parameter(s) but is invoked with (0) argument(s)

О чем это вам говорит? Он говорит вам, что он не ожидает пустого [], но он будет ожидать, что вы предоставите индексатору число, например 0, как это: [0]. Проблема с выполнением этого здесь, однако, заключается в том, что это было бы несоответствием сигнатуре метода.

Так что же мы хотим?

Мы просто хотим вернуть массив, который мы создали, поэтому просто удалите [] и возврат m_Answers прямо так:

public string[] Answer
{
    get { return m_Answers; }
    set { m_Answers = value; }
}
Обратите внимание, что вы также пропустили фигурную скобку в конце, если set.

При исправлении этого могут возникнуть дополнительные проблемы в коде, но доверяйте компилятору и постарайтесь его слушать!