- PR -

Class、Namespaceの名称が同じだとエラーになる??(ソース有り)

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-08 11:14
引用:

ぶさいくろうさんの書き込み (2007-02-08 10:25) より:

>しかしこちら↓は名前空間を定義している訳ではない、という事ですね。
え?そうなの?定義だと思ってた。
クラスで定義が重複した場合は重複を許さないのでエラー。
っても同じ名前空間じゃないとエラーにならんけど。
んで名前空間の場合は定義が重複していてもビルドの時に統合されるからエラーにならんだけだと理解していたが違うのか・・


アセンブリになる前の時点では宣言、アセンブリになった後は定義、ですね。

まあ、名前空間はクラスとは、明らかに都合が違うものですから、
「定義である」 とか 「定義でない」 という理由で理解は得られないと思います。

同じプロジェクト内の名前空間は、コンパイル時に勝手に '統合' されます。
アセンブリになった後 (違うプロジェクト (異なるアセンブリ)) の名前空間は、
'既に定義されている' 名前空間に '追加されるように' なっています。

よって、重複があっても名前空間だけが原因でコンパイル エラーになることはないわけです。
名前空間というコンテナの中にいる要素ども (クラス、インターフェイス、デリゲート...etc)
などの 「完全修飾名が一意でない」 場合は、コンパイル エラーになります。

質問元の投稿にあるソースは、まさに上記の理由でコンパイル エラーになっています。
同じ名前空間で同名のクラスを定義している、つまり 「完全修飾名が一意でない」 わけです。

...ということが前の投稿で言いたかったのですが、説明悪かったですかね... (ノД`)・゚・。

単に、
  • クラスは、重複が許されず一意になることが強制されているので、'完全修飾名で' 重複が発生する場合はコンパイル エラーになる。
  • 名前空間は、重複が許されるというか重複が発生しても統合/追加されることになっているので、コンパイル エラーにならない。
と書いた方が簡潔かもしれませんね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2007-02-08 11:20
@IT:連載 改訂版 C#入門 第10章 名前空間とusing
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_010/cs2_010_01.html
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2007-02-08 11:21
ぶさいくろうさん、こんにちは。

引用:

>しかしこちら↓は名前空間を定義している訳ではない、という事ですね。
え?そうなの?定義だと思ってた。


え? あれ?
「定義」してるわけじゃなくて、「宣言」してるんだと思ってたけど…。
違ったかな?

#いや、別に揚足取ってるわけじゃなくて。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-02-08 11:22
クラスライブラリで
コード:
namespace NS1
{

}

namespace NS2
{
	public class Class1{}
}


このようにして、そのクラスライブラリを参照するアプリケーションで
コード:
using NS1;
using NS2;


としてみました。

NS1の方はコンパイルエラーになりました。
ildasmで見てみても、NS1は存在しません。

なので、「ネームスペースを定義する」というよりは、クラスにそれを修飾するネームスペースが付くって感じですかね。
書き方はクラスみたいに何かを定義するような書き方ですけど。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2007-02-08 11:42
引用:

じゃんぬねっとさんの書き込み (2007-02-08 11:14) より:
アセンブリになる前の時点では宣言、アセンブリになった後は定義、ですね。


おぉ。それは知りませんでした。

引用:

「定義である」 とか 「定義でない」 という理由で理解は得られないと思います。


「A とはこういうものです」という定義が 2 つあると「どっちなんだよ」と突っ込まれますが、「ここからここまでは B というグループに含まれますよ」という宣言は、別に 2 つあろうが 3 つあろうが構わないでしょ、というような事が言いたかったのでありました。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2007-02-08 12:33
微妙に語弊がありそうですが…

引用:

じゃんぬねっとさんの書き込み (2007-02-08 11:14) より:
アセンブリになる前の時点では宣言、アセンブリになった後は定義、ですね。

同じプロジェクト内の名前空間は、コンパイル時に勝手に '統合' されます。
アセンブリになった後 (違うプロジェクト (異なるアセンブリ)) の名前空間は、
'既に定義されている' 名前空間に '追加されるように' なっています。


名前空間の定義というようなものは、CLRには存在してないはずです。
名前空間とは、型の完全な名前の一部であるだけです。
よって、名前空間にはそもそも重複とか結合という概念自体がありません。

異なるアセンブリの同一名前空間というのは、統合というような何かが
行われるわけではなく、単にC#などの多くの言語では、コンパイル時に
名前空間を含むクラス名だけで型を識別するルールになっているだけです。

よって異なるアセンブリに同一名前空間、同一クラス名のクラスを定義する
ことはできますが、C#などの言語のルール上、同時に参照することはできません。
しかし、CLR上では何の問題もなく共存します。

名前空間は、単に名前の一部であり、定義といったものは存在しません、ということで。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-08 13:09
引用:

なちゃさんの書き込み (2007-02-08 12:33) より:

名前空間の定義というようなものは、CLRには存在してないはずです。
名前空間とは、型の完全な名前の一部であるだけです。
よって、名前空間にはそもそも重複とか結合という概念自体がありません。


そうですね、CLR 的には名前空間のみの定義などありません。
単に識別子の '定義の一部' になっているだけです。
このあたりは、某 DonBox 著書に書いてあったので良く覚えています。

結合 (しているように見える) については、CLR は関係なくて IDE がそうしているだけですね。
このことからして、Microsoft の思惑としては、概念的に '組織化' していると見て欲しいのだと考えています。

多分ですが、CLR 的なことを意識して欲しくない (というか、意識させずに済むようにしている) のでしょうね。
リファレンスにもそうであるかのように書いてありますし...
(これは、あくまで概念で書いてあるだけだと思いますが)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-02-08 15:55
なーるほど。定義じゃなくてビルド後は定義の一部になるってことね。

途中でアセンブリなる単語が出てきて結合うんぬんの話が出てきたけど。
これはもともと概念の話をしていたってことね。
ビルド後の話もまざっていたのでCLRの話かと思ってしまった・・

確かにMSDNには概念として結合されるように動作すると書いてあるね。
理解できたと思われ。

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