ключевое слово var без использования someNamespace - PullRequest
3 голосов
/ 07 мая 2010

Как Visual Studio / intellisense узнает, что делать с переменной, объявленной как var, даже если вы не включаете необходимое объявление using в верхней части?

Например, у меня есть класс MyDomainObject, определенный в другом пространстве имен Если я не объявлю using TheOtherNameSpace; в файле, следующий код не скомпилируется:

private void Foo()
{
   MyDomainObject myObj = new MyDomainObject(); 
   // Doesn't know what this class is
}

Но если я использую var

var myObj = new MyDomainObject();

Это скомпилируется, и intellisense точно знает, что я могу с ним сделать.

Так как, черт возьми, он знает, что это за тип без using?

(И, кроме того, если он знает без using, зачем вообще нужны using с?!)

Ответы [ 3 ]

6 голосов
/ 07 мая 2010

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

  • класс Foo в пространстве имен N1
  • класс Bar в пространстве имен N2
  • класс Baz в пространстве имен N3

Теперь предположим, что Bar имеет метод, который возвращает экземпляр Foo:

public static Foo GetFoo() { ... }

Здесь Bar.cs должен был бы использовать директиву using для N1, если только он не указал имя полностью.

Теперь предположим, что у нас есть этот код в Baz:

using N2;
...
var foo = Bar.GetFoo();

Это скомпилируется, но

using N2;
...
Foo foo = Bar.GetFoo();

не будет. Причина заключается в том, что директивы используются только для того, чтобы компилятор знал, что означает имя «Foo» - каково его полное имя. В первом фрагменте Bar.GetFoo() объявлено как возвращающее N1.Foo, так что компилятор в порядке. Во втором фрагменте компилятор сначала видит «Foo» и ничего не знает о N1, поэтому не знает, как его искать.

6 голосов
/ 07 мая 2010

Короткий ответ: нет.

Должна быть какая-то другая причина поведения и различий, которые вы видите.

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

В ключевом слове var нет ничего волшебного, оно просто выводит необходимый тип на основе выражения в правой части присваивания (в данном случае), поэтому нет причины, по которой один из фрагментов кода должен работать лучше, чем другие.

0 голосов
/ 07 мая 2010

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

using SomeNamespace - это всего лишь сокращение, позволяющее сказать MyType вместо SomeNamespace.MyType.

...