- PR -

C#のネームスペースについてno

1
投稿者投稿内容
AYA
会議室デビュー日: 2002/10/29
投稿数: 10
投稿日時: 2003-07-15 13:48
こんにちはAYAと申します。

C#の文法についての非常に初歩的な質問があります。

C#のネームスペースについてですが、下記のようなコードがあるとします。

namespace test
{
public class ClassA
{
public static void Main(string[] args)
{
System.Console.WriteLine("hello");
}
}
}

このコード中に、下記のようなネームスペースを導入すると、Consoleクラス
でコンパイルエラーが発生します。

<<エラーメッセージ>>
型、または名前空間'Console'は、クラスまたは名前空間'test.System'に存在
しません。

namespace test
{
public class ClassA
{
public static void Main(string[] args)
{
System.Console.WriteLine("hello");
}
}
}
#if true
namespace test.System
{
}
#endif

#ifのtrue/falseを切り替えてみると、コンパイルが成功したり失敗したりし
ます。

System.Consoleは完全修飾で指定したつもりなのですが、そのようには解釈し
てくれないようです。

・usingエイリアスの利用
・using Systemを定義して"Console"で利用
などを行えば回避できるようですが、ウィザードが出力したコードではこのよう
な回避が行えません。
そういうものなのでしょうか?


質問まとめ

C#(VisualStudio上)で完全修飾でクラス名を指定にはどのように記述すればよ
いのでしょうか?
また、どのような注意点があるのでしょうか?

実は基本的なルールをおろそかにしている可能性も大です。
どなたかアドバイスをいただけないでしょうか。
よろしくお願いします。
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2003-07-15 16:39
> System.Consoleは完全修飾で指定したつもりなのですが、

完全修飾とは何でしょうか?

namespace test.System {...}

namespace test {
namespace System {...}
}
だと思えば、コンパイル通らない理由は推測できます。
(C#の仕様がどうなのかは知りません。あしからず)
AYA
会議室デビュー日: 2002/10/29
投稿数: 10
投稿日時: 2003-07-15 19:29
catsさん お返事ありがとうございます

>完全修飾とは何でしょうか?
すみません不正確な用語を使ってしまいました。
正確な用語は「fully qualified name」だと思いますが、MSDNのC#言語仕様
9.名前空間では「完全限定名」という用語を使用しているようです。

>namespace test {
>namespace System {...}
>}
>だと思えば、コンパイル通らない理由は推測できます。
おそらくそういう現象だと思うのですが、これって結構大変なことだと思いま
せんか?(っていわれても困りますよね。)

たとえば下記のような名前は付けることができません。

・Common.XXX
・TheProject.Common.XXX

私はすでにはまりました。(安直過ぎるのが問題かも・・)

私個人の感想としては、「ピリオドで区切るほどぶつかる可能性が高くなる名
前空間なんて物はないはずだ」と思っていましたので、何らかの回避方法があ
ると思い、質問をさせていただきました。

とりあえず何らかの結論が見つかるまで危うい名前を付けることは自粛するこ
とにします。

ありがとうございました。
Izumi, Y.
ベテラン
会議室デビュー日: 2002/03/19
投稿数: 77
お住まい・勤務地: 東京
投稿日時: 2003-07-16 13:37
C# 言語仕様の「3.8 名前空間と型の名前」というところに、型名の解決方法に関して詳細に記述されていました。それによれば、
引用:

それ以外の場合は、namespace-or-type-name が存在する名前空間から開始し、外側にある各名前空間 (存在する場合) を経て、グローバル名前空間まで、エンティティが見つかるまで次の手順を評価します。


とあります。namespace test.System {...} という宣言は、cats さんの発言にあるように test 名前空間の中に System という名前空間を定義したことになるので、グローバル名前空間に達する前に test.System が見つかってしまい、件のエラーが発生します。

それで、グローバル名前空間を明示的に指定する方法があれば解決するわけですが、ちょっとばかり探した程度では見つかりませんでした。そのような指定は不可能なのではないか、と推測しています。


[ メッセージ編集済み 編集者: IZUMI Yusuke 編集日時 2003-07-16 13:42 ]
1

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