Могу ли я ПОЛУЧИТЬ и УСТАНОВИТЬ массив в С#?

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

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

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

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;
}

...

Я использую 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[].

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


person dwwilson66    schedule 04.12.2013    source источник
comment
получить { вернуть m_Answers; } должно сработать   -  person Bit    schedule 05.12.2013
comment
+1 за заявление о том, что это вопрос домашнего задания, и на самом деле за попытку поработать над ним, прежде чем обращаться за помощью!   -  person Kevin    schedule 05.12.2013
comment
m_Answers уже является массивом, нет причин снова приводить его к одному в вашем операторе return   -  person NWard    schedule 05.12.2013
comment
В вашем коде проблемы повсюду. Это понятно, но я бы попытался решить одну проблему за раз. В идеале выберите одну ошибку времени компиляции, закомментируйте остальную часть неработающего кода и скомпилируйте эту часть. Затем посмотрите на следующую задачу и т. д. Это поможет вам, так сказать, увидеть лес за деревьями.   -  person Jon Skeet    schedule 05.12.2013
comment
@NWard, это не кастинг, он пытается получить доступ к индексу, не указывая индекс!   -  person Filip Ekberg    schedule 05.12.2013


Ответы (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.

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

person Filip Ekberg    schedule 04.12.2013