3

var先頭に必要な宣言を含めなくても、Visual Studio/intellisense は as 宣言された変数の処理方法をどのように認識しusingますか?

たとえばMyDomainObject、別の名前空間で定義されたクラスusing TheOtherNameSpace;があります。ファイルで宣言しないと、次のコードはコンパイルされません。

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

しかし、私が使用する場合var

var myObj = new MyDomainObject();

これはコンパイルされ、インテリセンスは私がそれで何ができるかを正確に知っています。

では、どのようにして型が何であるかを知ることができusingますか?

(余談ですが、 がなくてもわかっているのにusing、なぜ が必要なusingのですか?!)

4

3 に答える 3

6

短い答えは、そうではないということです。

表示されている動作と違いには、他の理由があるはずです。

ここに投稿できるように、短いが完全なプログラムで問題を再現できますか?

キーワードには魔法のようなものは何もありませんvar。割り当ての右側の式に基づいて必要な型を推測するだけなので (この場合)、コード片の 1 つが他の部分よりもうまく機能する理由はありません。

于 2010-05-07T14:35:39.683 に答える
6

Your example with a constructor won't work, but a slightly more involved situation will. For example, suppose you have three types:

  • class Foo in namespace N1
  • class Bar in namespace N2
  • class Baz in namespace N3

Now suppose Bar has a method which returns an instance of Foo:

public static Foo GetFoo() { ... }

Here, Bar.cs would need a using directive for N1, unless it specified the name in full.

Now suppose that we have this code in Baz:

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

That will compile, but

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

won't. The reason is that using directives are only there so that the compiler knows what the name "Foo" means - what its fully qualified name is. In the first snippet, Bar.GetFoo() is effectively declared to return N1.Foo, so the compiler is fine. In the second snippet, the compiler first sees "Foo" and doesn't know anything about N1, so doesn't know how to look it up.

于 2010-05-07T14:40:59.793 に答える
0

It knows the fully-qualified type of the object because this type is in one of the referenced assemblies.

using SomeNamespace is only a shorthand making it possible to say MyType instead of SomeNamespace.MyType.

于 2010-05-07T14:39:59.597 に答える