none
クラスライブラリのプロジェクト参照時のusingディレクティブが効かない RRS feed

  • 質問

  • VisualStudio2005でクラスライブラリを作成し、デバッグのためにWindowsFormプロジェクトを追加してプロジェクト参照を設定しました。

    クラスライブラリのプロジェクト

        プロジェクト名:test

        NameSpace:test

        クラス名:test

    WindowsFormプロジェクトのForm1の先頭で

        using test.test;

    とやりたいのですが、「test.」と打ってもインテリセンスが働かないので何か間違っていると思いますが、原因がわかりません。「using test;」だけだと宣言時に

        test.test test = new test.test();

    などと書かねばならず、不便です。原因などお心当たりがございましたら、教えて下さい。よろしくお願いします。

     

    2012年1月6日 0:03

回答

  • プロジェクト名、namespace、クラス名が全て同じなのはどうかと・・・

    今回の原因としては、namespaceとクラス名が同一の為、VisualStudio側でtestと指定されても判断が付いていない状態と思われます。

     

    例えば、

    プロジェクト名:TestProject

    namespace:TestNamespace

    クラス名:TestClass

    とし、using TestNamespace;としてみて下さい。

    インテリセンスが正しく動作すると思います。

    • 回答としてマーク marvelous 2012年1月6日 0:42
    2012年1月6日 0:22
  • 普通に using test; としておけば test a = new test(); と記述できると思いますが。 名前空間名とクラス名を同じにすると分かりづらいので、できるだけ異なる名前にしておきましょう。
    • 回答としてマーク marvelous 2012年1月6日 0:42
    2012年1月6日 0:22

すべての返信

  • プロジェクト名、namespace、クラス名が全て同じなのはどうかと・・・

    今回の原因としては、namespaceとクラス名が同一の為、VisualStudio側でtestと指定されても判断が付いていない状態と思われます。

     

    例えば、

    プロジェクト名:TestProject

    namespace:TestNamespace

    クラス名:TestClass

    とし、using TestNamespace;としてみて下さい。

    インテリセンスが正しく動作すると思います。

    • 回答としてマーク marvelous 2012年1月6日 0:42
    2012年1月6日 0:22
  • 普通に using test; としておけば test a = new test(); と記述できると思いますが。 名前空間名とクラス名を同じにすると分かりづらいので、できるだけ異なる名前にしておきましょう。
    • 回答としてマーク marvelous 2012年1月6日 0:42
    2012年1月6日 0:22
  • ご回答ありがとうございました。さっそく、NameSpaceを変更したところ、うまくいきました。

        プロジェクト名:Test

        namespace:Hoge

        クラス名:Test

    とし、WindowsFormプロジェクト側で

        using Hoge;

    とする事で、

       Test t = new Test();

    と宣言できました。ありがとうございました。

    2012年1月6日 0:42
  • このケースだと普通に using test; としても test a = new test(); と記述できないと思いますよ。

    test というのがnamespaceだかクラス名だかの判断が機械的に出来ませんので・・・

    2012年1月6日 2:36
  • 試してみました。質問の通り、namespace test、class testが存在したとして、

    using test;
    class hoge{
      void fuga(){
        test t = new test(); // CS0118
      }
    }

    でしたが

    namespace hoge{
      using test;
      class hoge{
        void fuga(){
          test t = new test(); // OK
        }
      }
    }

    と、namespace内に宣言した場合は型名と認識されました。 @VS2010

    2012年1月6日 4:22
  • ・・・そこに using を記載出来るというのは初めて知りました。

    にしても同じ動作じゃないんですね。

    (誤読や勘違いを招きそう)

     

    少し違和感を感じますが、勉強になりました。

    2012年1月6日 5:18
  • # 参考になったと投票してもいいのよ?

    全くもって言葉足らずでしたが、記載位置で動作が異なるわけではありません。

    名前の検索は内側から外側に行われます。

    1. namespace hoge内でtestを探す
    2. 無かったらその外側、今回はグローバルスコープでtestを探す

    です。後者の例では1.でhoge内にtest.*が取り込まれているため、testクラスが見つかります。
    前者の例では1.でtestが見つかりません。2.ではnamespace testと(using testによる)test.testクラスの両方が見つかります。そのため曖昧としてエラーになります。

    というわけで例えば、namespace unyu.test とかだったら、前者のコードでも合間にならずにコンパイルが通ります。

    2012年1月6日 5:39