Инициализация списка 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" }; }
}
Ответы
Ответ 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, вы получите эту ошибку.