2009-12-18 3 views
17

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

код у меня выглядит следующим образом:

public static Dictionary<string, string> CommandList = new Dictionary<string, string>{}; 

, и я хотел бы иметь:

public static var CommandList = new Dictionary<string, string> 

Почему это не возможно?

+0

Есть ли у вас ошибка в компиляции? Что он говорит? –

+0

Не удается разрешить символ var. Кажется, что var просто не распознается вне методов. –

ответ

30

Моя статья на эту тему:

Why no var on fields?

Резюмируя:

  1. Если у нас есть «переменная» поля, то тип поля не может быть определена до тех пор, выражение не анализируется , и это происходит после того, как нам уже нужно знать тип поля.

  2. Что делать, если в этих ссылках есть длинные цепи или даже циклы? Все эти алгоритмы должны быть переписаны и протестированы в мире, где информация типа верхнего уровня определяется от их, а не потребляется от.

  3. Если у вас есть поля «var», то инициализатор может быть анонимного типа. Предположим, что поле открыто. В CLR или CLS еще нет стандарта о том, какой правильный способ открыть поле анонимного типа.

+3

Эта статья - хороший материал. Очень подробно о том, как и почему. –

0

Короткий ответ заключается в том, что спецификация говорит, что это не является законным. ;-)

Как правило, это не то, что вы хотите делать в любом случае. Тип элемента должен быть IDictionary<string, string> не Dictionary<string, string>. Это небольшая нить, но обычно лучше использовать интерфейс во внешнем видимом объекте, чтобы впоследствии вы могли изменить тип, не затрагивая клиентов кода. Компилятор просто дает вам немного толчка, чтобы вести вас в этом направлении.

+5

-1 Это не имеет никакого отношения к тому, используете ли вы интерфейс или конкретный тип –

+4

-1 согласны с Пит. Ошибка не связана с «подталкиванием в правильном направлении» –

+0

Я не говорил, что это так. Я сказал, что это потому, что спецификатор так сказал. В отличие от Эрика Липперта, я не могу делать заявления о том, почему выбор был сделан, поскольку меня там не было. Тем не менее, я считаю, что даже если бы это было не так сложно, как описано ниже, что они выбрали бы не по той причине, которую я перечислял. Плохая идея разоблачить внутреннюю информацию фактического типа в переменной в интерфейсе объекта. И я намекал, что этот вопрос ведет к плохому решению. Может быть, слишком тонкий. –

6

От C# reference

  • Начиная с Visual C# 3.0, переменные, которые объявлены в методе объем может иметь неявный тип вар.

Кроме того, из The C# Programming Reference

  • вар может быть использован только тогда, когда локальная переменная объявляется и инициализируется в одном операторе; переменная не может быть инициализирована нулем, или группе методов или анонимной функции.
  • var не может использоваться в полях класса.

Он просто не предназначен для использования, которое вы имеете в виду.

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

+1

+1 для цитирования спецификации и ссылки – jcoder

Смежные вопросы