Подтвердить что ты не робот

Инициализация списка inline

При этом возникает странная ошибка: (.net 2.0)

public overrides List<String> getSpaceballs
{
    get { return new List<String>() { "abc","def","egh" }; }
}

VS запрашивает ; после (). Почему?

Я уверен, что смогу это сделать:

public overrides string[] getSpaceballs
{
    get { return new string[] { "abc","def","egh" }; }
}
4b9b3361

Ответ 1

Первый вариант не является законным:)

Вы можете использовать этот тип инициализатора только для массивов.

- Изменить: см. публикацию Эндрю Харе (и другие, ниже); он доступен только в версиях v3 и выше.

- Изменить еще раз:

Просто, чтобы быть ясным, если ваш компилятор имеет 3 или более, вы можете настроить таргетинг 2.0, чтобы заставить его работать (потому что он скомпилирован до кода, показанного Эндрю ниже). Но если ваш компилятор равен 2, вы не можете.

Ответ 2

С# синтаксис инициализации коллекции поддерживается только в версиях 3 и выше (поскольку вы упомянули .NET 2.0, я собираюсь предположить, что вы также используете С# 2). Это может быть немного запутанным, поскольку С# всегда поддерживал аналогичный синтаксис для инициализации массива, но на самом деле это не то же самое.

Инициализаторы коллекции - это трюк компилятора, который позволяет создавать и инициализировать коллекцию в одном из следующих утверждений:

var list = new List<String> { "foo", "bar" };

Однако этот оператор переводится компилятором на это:

List<String> <>g__initLocal0 = new List<String>();
<>g__initLocal0.Add("foo");
<>g__initLocal0.Add("bar");
List<String> list = <>g__initLocal0;

Как вы можете видеть, эта функция представляет собой немного синтаксического сахара, который упрощает шаблон в одном выражении.

Ответ 3

Как указывают другие пользователи, это не поддерживается в версии 2.0. Однако вы можете имитировать это, выполнив следующие действия.

public overrides List<String> getSpaceballs
{
   get { return new List<String> ( new String[] {"abc","def","egh"} ); }
}

Обратите внимание, что это создает некоторые вычислительные накладные расходы.

Ответ 4

Какую версию VS вы используете? Это только легальный синтаксис в С# 3.0, поэтому, если вы используете VS2005, вы получите эту ошибку.