- PR -

partial class について

1
投稿者投稿内容
Furi2
ベテラン
会議室デビュー日: 2004/10/28
投稿数: 74
お住まい・勤務地: N.Hollywood/Agoura Hills
投稿日時: 2009-03-03 09:04
初歩的なことをお伺いいたします。(ASP.NET 2.0)
あるクラスを、partialにして、aspx.csと、App_Code下の.csに分けたいと思ったとき、下記の部分で、メソッドが存在しない、と、コンパイル・エラーになってしまいます。aspx.cs内のクラスを消してしまえばエラーは出ません。何か私が見落としているのでしょうか、、それともこの場合、partialはクラスを一つにしてくれない、ということなのでしょうか、、?? この二つのクラス同士も、お互いのメソッドを参照できないようです。
どなたかご教授いただけると、大変ありがたいです。

コード:

// Test.aspx.cs ///////////
public partial class TestPage : System.Web.UI.Page
{
protected void Page_Load( object sender, EventArgs e )
{
ClassA.Method2(); // コンパイル・エラー
}
}
namespace TestNameSpace
{
public partial class ClassA
{
public static void Method1()
{
}
}
}


// App_Code/Test.cs //////

namespace TestNameSpace
{
public partial class ClassA
{
public static void Method2()
{
}
}
}



[ メッセージ編集済み 編集者: Furi2 編集日時 2009-03-03 09:05 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2009-03-03 10:50
同じコンパイル単位に partial の全てが存在しないとだめなんじゃないかな。要するに、同じアセンブリ(もしくはモジュール?)に。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2009-03-03 13:02
App_Codeを使ってるところをみると、Webサイトプロジェクトかな?

Webサイトプロジェクトの場合、.aspxと.aspx.csからそれぞれ別のソースが自動的に生成されて、そのうえでコンパイルが行われます。
.aspx.csにクラスを記述した場合、どのようなソースが生成されるかは確認してみないことにはわかりませんね。
たしか、ソースの自動生成時に独自のnamespaceが付加されたように思うので、.aspx.csに記述したほうのTestNameSpaceはその独自のnamespaceの中に入り込んでしまって、namespaceが異なるために同じClassAだと認識できない、ということになっているような気がします。
セラフ
ベテラン
会議室デビュー日: 2005/12/01
投稿数: 95
お住まい・勤務地: 東北の顔の形といえば
投稿日時: 2009-03-03 13:18
引用:

Furi2さんの書き込み (2009-03-03 09:04) より:
コード:
         ClassA.Method2();    // コンパイル・エラー




これは単純にnamespaceが違うので、コンパイルエラーが発生しているだけでしょう。
正しくは、
コード:
         TestNameSpace.ClassA.Method2();

かな?

しかし、ビルドの依存関係があるためにnamespaceを正しく指定しても、恐らくお望みの動作とはならないでしょう。

http://msdn.microsoft.com/ja-jp/library/wa80x488%28VS.80%29.aspx
↑の中間よりやや下に以下のような記述があります。

「同じ型の部分である部分型定義はすべて同じアセンブリまたは同じモジュール (.exe ファイルまたは .dll ファイル) 内で定義する必要があります。部分定義は、複数のモジュールにまたがることができません。」

簡単に説明すると、プロジェクトのタイプが「Webサイト」の場合、App_WebとApp_Codeが別DLLとしてビルドされるために、namespaceが一緒でもDLLが違うためにクラスの競合が発生して、エラーとなりますよ〜。って感じでしょうか。

※App_Webとは、App_Code以外のフォルダのaspx.csなどをビルドしたDLLがApp_Webで始まるDLL名となることから、私が勝手につけた説明しやすくするための便宜上の名前です。
Furi2
ベテラン
会議室デビュー日: 2004/10/28
投稿数: 74
お住まい・勤務地: N.Hollywood/Agoura Hills
投稿日時: 2009-03-03 14:03
どっとねっとふぁんさん、
そうです、ASP.NET2.0のWebプロジェクトです。

セラフさん、
すみません、含めるのを忘れてしまいましたが、aspx.csの冒頭に、using TestNameSpace;があります。ですのでエラーは、「ClassAが見つからない」のではなく、「ClassAにMethod2がない」、というものでした。現にaspx.cs内のClassAを消してしまえば、残ったApp_Code内のClassAを参照する形になって、コンパイルエラーはでません。

それでも皆様がおっしゃるように、アッセンブリが分かれてしまうから、というのは合点です。つまり、このやり方は使えない、って事ですね!

勉強になりました。皆様、教えていただいてありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)