- - PR -
Class、Namespaceの名称が同じだとエラーになる??(ソース有り)
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-02-08 11:14
アセンブリになる前の時点では宣言、アセンブリになった後は定義、ですね。 まあ、名前空間はクラスとは、明らかに都合が違うものですから、 「定義である」 とか 「定義でない」 という理由で理解は得られないと思います。 同じプロジェクト内の名前空間は、コンパイル時に勝手に '統合' されます。 アセンブリになった後 (違うプロジェクト (異なるアセンブリ)) の名前空間は、 '既に定義されている' 名前空間に '追加されるように' なっています。 よって、重複があっても名前空間だけが原因でコンパイル エラーになることはないわけです。 名前空間というコンテナの中にいる要素ども (クラス、インターフェイス、デリゲート...etc) などの 「完全修飾名が一意でない」 場合は、コンパイル エラーになります。 質問元の投稿にあるソースは、まさに上記の理由でコンパイル エラーになっています。 同じ名前空間で同名のクラスを定義している、つまり 「完全修飾名が一意でない」 わけです。 ...ということが前の投稿で言いたかったのですが、説明悪かったですかね... (ノД`)・゚・。 単に、
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2007-02-08 11:20
@IT:連載 改訂版 C#入門 第10章 名前空間とusing
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_010/cs2_010_01.html | ||||||||
|
投稿日時: 2007-02-08 11:21
ぶさいくろうさん、こんにちは。
え? あれ? 「定義」してるわけじゃなくて、「宣言」してるんだと思ってたけど…。 違ったかな? #いや、別に揚足取ってるわけじゃなくて。 | ||||||||
|
投稿日時: 2007-02-08 11:22
クラスライブラリで
このようにして、そのクラスライブラリを参照するアプリケーションで
としてみました。 NS1の方はコンパイルエラーになりました。 ildasmで見てみても、NS1は存在しません。 なので、「ネームスペースを定義する」というよりは、クラスにそれを修飾するネームスペースが付くって感じですかね。 書き方はクラスみたいに何かを定義するような書き方ですけど。 | ||||||||
|
投稿日時: 2007-02-08 11:42
おぉ。それは知りませんでした。
「A とはこういうものです」という定義が 2 つあると「どっちなんだよ」と突っ込まれますが、「ここからここまでは B というグループに含まれますよ」という宣言は、別に 2 つあろうが 3 つあろうが構わないでしょ、というような事が言いたかったのでありました。 | ||||||||
|
投稿日時: 2007-02-08 12:33
微妙に語弊がありそうですが…
名前空間の定義というようなものは、CLRには存在してないはずです。 名前空間とは、型の完全な名前の一部であるだけです。 よって、名前空間にはそもそも重複とか結合という概念自体がありません。 異なるアセンブリの同一名前空間というのは、統合というような何かが 行われるわけではなく、単にC#などの多くの言語では、コンパイル時に 名前空間を含むクラス名だけで型を識別するルールになっているだけです。 よって異なるアセンブリに同一名前空間、同一クラス名のクラスを定義する ことはできますが、C#などの言語のルール上、同時に参照することはできません。 しかし、CLR上では何の問題もなく共存します。 名前空間は、単に名前の一部であり、定義といったものは存在しません、ということで。 | ||||||||
|
投稿日時: 2007-02-08 13:09
そうですね、CLR 的には名前空間のみの定義などありません。 単に識別子の '定義の一部' になっているだけです。 このあたりは、某 DonBox 著書に書いてあったので良く覚えています。 結合 (しているように見える) については、CLR は関係なくて IDE がそうしているだけですね。 このことからして、Microsoft の思惑としては、概念的に '組織化' していると見て欲しいのだと考えています。 多分ですが、CLR 的なことを意識して欲しくない (というか、意識させずに済むようにしている) のでしょうね。 リファレンスにもそうであるかのように書いてありますし... (これは、あくまで概念で書いてあるだけだと思いますが) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2007-02-08 15:55
なーるほど。定義じゃなくてビルド後は定義の一部になるってことね。
途中でアセンブリなる単語が出てきて結合うんぬんの話が出てきたけど。 これはもともと概念の話をしていたってことね。 ビルド後の話もまざっていたのでCLRの話かと思ってしまった・・ 確かにMSDNには概念として結合されるように動作すると書いてあるね。 理解できたと思われ。 |