none
partial で複数ファイルに分割、参照できない RRS feed

  • 質問

  • C#初心者です。 Visual studio 2010 Express C# を使用。

    以下のように、partial で複数ファイルに分割しておりますが、
    「名前'method_x'は現在のコンテキスト内に存在しません。」

    とのメッセージでエラーとなります。

    基本的なことですのに。。。Expressは機能制限しているのでしょうか?

    よろしくご教授いただけますようお願い致します。

    // file A
    namespace     WindowsFormsApplication1
    {
        public partial class    form1 : form
        {
            private    void    method_a()
            {
                method_x();            // エラー
                ・・・

    // file B
    namespace     WindowsFormsApplication1
    {
        public partial class    form1 : form
        {
            public   void    method_x()
            {
            }
             ・・・

    尚、当該ソリューション(プロジェクト X 1)の規模は、50クラス X 100ステップ程になります。

    2010年7月28日 5:04

回答

  • # 「プロジェクトX1」とは単一プロジェクトという意味でしょうか?

    そんなことはありません。目を皿のようにして確認してください。きっとどこか1文字間違っているののだと思います。

    なお、C#コンパイラはVisual Studioではなく、.NET Frameworkランタイムライブラリに含まれるため、エディションによる違いはありません。

    • 回答としてマーク 山本春海 2010年7月30日 4:48
    2010年7月28日 6:04
  • 佐裕理様、有難うございます。

    はい、「単一プロジェクト」の意味です。

    >どこか1文字間違っている

    必要な部分はコピーをしております。

    >エディションによる違いはありません

    承知しました。

     

    • 回答としてマーク 黄昏男子 2010年7月28日 9:52
    2010年7月28日 9:29
  • totojo様、有難うございます。

    はい、 .cs  ファイルです。

    プロジェクトファイルの一員となっております。

    >試しに file B に別の新しいクラスを定義してみると、file A のコードから正しく呼べますか?

    これは再三、いろんなバーリエーションで確認しております。

     

    ここで試しに、「新しい .cs ファイルを追加」して、そこに「FileB の内容のみを移動」してコンパイルしてみたら・・・エラーが取れました!

    それまでは既存の、クラスを記述していたファイルに「追加」していた。

     

    以前にも、画面の設計のために、コントロールをいっぱい貼り付けたら、突然に「同じエラーが発生しました」

    それで、機能制限をされているのかも? と思った訳です。

     

    佐裕理様、totojo様

    有難うございました。 今後ともよろしくお願いします。

     

    • 回答としてマーク 黄昏男子 2010年7月28日 9:52
    2010年7月28日 9:51

すべての返信

  • # 「プロジェクトX1」とは単一プロジェクトという意味でしょうか?

    そんなことはありません。目を皿のようにして確認してください。きっとどこか1文字間違っているののだと思います。

    なお、C#コンパイラはVisual Studioではなく、.NET Frameworkランタイムライブラリに含まれるため、エディションによる違いはありません。

    • 回答としてマーク 山本春海 2010年7月30日 4:48
    2010年7月28日 6:04
  • 基本的なことですのに。。。Expressは機能制限しているのでしょうか?

    そのようなことはありません。Windows フォームのデザインとコードを分離するところで partial class が使えているはずです。
    ちなみに、2つのファイルは同じプロジェクトに属しており(同じアセンブリに出力される)、
    正しくクラス ファイルとして認識されている(拡張子が .cs であるとか)、と考えていいですか?
    試しに file B に別の新しいクラスを定義してみると、file A のコードから正しく呼べますか?

    参考:
     10 行でズバリ !! パーシャル クラスの利用 (C#)
     http://msdn.microsoft.com/ja-jp/events/dd253126.aspx
    2010年7月28日 6:06
  • 佐裕理様、有難うございます。

    はい、「単一プロジェクト」の意味です。

    >どこか1文字間違っている

    必要な部分はコピーをしております。

    >エディションによる違いはありません

    承知しました。

     

    • 回答としてマーク 黄昏男子 2010年7月28日 9:52
    2010年7月28日 9:29
  • totojo様、有難うございます。

    はい、 .cs  ファイルです。

    プロジェクトファイルの一員となっております。

    >試しに file B に別の新しいクラスを定義してみると、file A のコードから正しく呼べますか?

    これは再三、いろんなバーリエーションで確認しております。

     

    ここで試しに、「新しい .cs ファイルを追加」して、そこに「FileB の内容のみを移動」してコンパイルしてみたら・・・エラーが取れました!

    それまでは既存の、クラスを記述していたファイルに「追加」していた。

     

    以前にも、画面の設計のために、コントロールをいっぱい貼り付けたら、突然に「同じエラーが発生しました」

    それで、機能制限をされているのかも? と思った訳です。

     

    佐裕理様、totojo様

    有難うございました。 今後ともよろしくお願いします。

     

    • 回答としてマーク 黄昏男子 2010年7月28日 9:52
    2010年7月28日 9:51
  • 終わった話ですけど・・・

    > プロジェクトファイルの一員となっております。

    今回の状況からは、実際はそうなっていない可能性もあると思いました。

    実際に編集されたファイルは、ファイル名はプロジェクトに属しているものと同じでも、プロジェクトに属していない別のフォルダのファイルだったりしないでしょうか?

    たとえば次の操作を行った場合には、簡単にそのような状況になります。
    ブックマークを使っている既存プロジェクトをコピーし、そのコピー先プロジェクトを開いてからブックマークを使ってファイルを開くと、ぱっと見はコピー先でのプロジェクトのファイルを開いているように見えますが、実際はコピー元のプロジェクトのファイルが開かれています。
    (この場合、ブレークポイントも働きません。)

    > 以前にも、画面の設計のために、コントロールをいっぱい貼り付けたら、突然に「同じエラーが発生しました」

    可能性の話ですが、こちらは、名前空間がらみかもしれないと思いました。
    コントロールの貼り付けによって新たな名前空間の using が追加され、既存の using された中のクラス名等と重複してしまったなど。

    今回の件、普通には発生しないことだと思っていますので、黄昏男子さんの何かの操作が関係している可能性があり、再発防止のためにも、もう少し追求されておかれることに価値はあると思いました。

    2010年7月29日 1:16
  • usingは参照のみに作用し、定義には影響しなかったと思います。

    それよりは「貼り付けたら」という記述が気になりました。

    namespace SomeWhere{

      ←ここにコードを貼り付け

    }

    とした場合、WindowsFormsApplication1.form1ではなくSomeWhere.WindowsFormsApplication1.form1として定義されてしまいます。

    2010年7月29日 6:27
  • TH01様 有難うございます。

    ショリューションエクスプローラに表示されている各ファイルのフォルダーを「完全パス」という項目で全部確認致しましたが、異常ありませんでした。

    using は 「using system」 から始まるものだけでした。

    仰る通り、もっと追及してみます。

    有難うございました。 今後ともよろしくお願いします。

    2010年7月29日 7:00
  • 佐裕理

    お世話になっております。

    namespace については、書き換えせずそのままの、WindowsFormsApplication1 を全ファイルで使用しております。

    変なコーデングをしている箇所がないか調べたいと思います。有難うございました。 今後ともよろしくお願いします。

    2010年7月29日 7:05
  • 異常なかったですか。ご確認ありがとうございました。

    (以前の話ではなく)今回の件、佐祐理さんが書かれたことも関係ないか確認されればと思います。
    実は file B の上の方に namespace の定義があって次のようになっているなど。
    (細かな確認指示ばかりですみません。。)

    // file B
    namespace SomeWhere
    {
      namespace WindowsFormsApplication1
      {
      }
    }

    今回の method_x メソッドの中で this. と書いて this にマウスポインターを重ねると、名前空間が表示されます。
    method_a メソッドでの結果と同じでしょうか?


    using の件ですが、以下の場合のエラーを想定して書きました。あくまで1例になります。
    (エラーメッセージは違いますが、同様のエラーと思われた可能性を考えました。失礼な話ですみません。)

    using Library1;
    ・・・
    Class1.StaticMethod(); // Library1 にあるクラス

    という状況において

    using Library1;
    using Library2; // Class1 のあるライブラリ
    ・・・
    Class1.StaticMethod(); // エラー「あいまいな参照です」

    しかし、フォームへのコントロールの配置(私は「貼り付け」を配置のことだと思いました)によって名前空間が自動的に using に追加されることはありませんので、入力補完や手動での using の追加が前提になりますし、レアケースでしょうけど・・・。

    2010年7月29日 7:18
  • TH01様 有難うございます。

    using は system 系のものだけ、

    namespace   も WindowsFormsApplication1 一つだけ使っております。

    ここでオブジェクトブラウザーを見ましたら、

    WindowsFormsApplication1 が2つ有るではないですか!

    良く見ると"a"が抜けていて、WindowsFormsAppliction1 となっており、これを直したら1つになり、見事解決しました。

     

    TH01様、佐裕理 様、totojo様

    有難うございました。 御手数をお掛けしました。

    未熟者ですから、また御助けを請う場合が有るかと思います。

    その時はまたよろしくお願いします。

     

    2010年7月30日 1:06
  • 真っ先に「目を皿のようにして確認してください」と書きましたよ☆
    2010年7月30日 1:09