C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■103054 / 1階層)  共通のSubを複数のFormから使うには
□投稿者/ 魔界の仮面弁士 (3757回)-(2024/04/09(Tue) 15:34:55)
No103052 (かりん さん) に返信
> 下の @ の部分に「エラー BC30179 structure 'datt' と structure 'datt' が
> namespace 'WindowsApp1' で競合しています」が出てしまい困っています。

エラーメッセージの通り、名前空間が競合しています。
両者の定義は同一のようですし、重複した宣言を削除して一つだけにしてみてください。


(質問1) @をどのファイルに書いていますか?
 Module1.vb ?
 Form1.vb ?
 Form2.vb ?
 それ以外?

(質問2) Structure datt は、そのファイルのどこに書いていますか?
 ファイル直下?
 「Module Module1 〜 End Module」の配下?
 「Class Form1 〜 End Class」の配下?
 「Namespace ××〜End Namespace」の配下?


実際のところ、大切なのは質問2の方だったりします。(質問1は重要では無い)
現在は恐らく、ファイル直下に書いているのですよね。


今回の場合、Form1.vb や Form2.vb に書かれている『Public Structure datt』の宣言を削除し、
それを、Module1.vb の下に移動してみてください。恐らくはそれで改善されると思います。

あるいは Module1.vb とは別に、datt.vb のような別ファイルを用意し、そこに移動させても OK です。



> よろしくお願いします。

=== 以下蛇足 ===

VB の場合、作成時のプロジェクト名がそのまま既定の『ルート名前空間』になります。
今回の場合は、WindowsApp1 という名前ですね。

『ルート名前空間』は変更したり空欄にすることも可能ですが、通常は気にする必要はありません。
変更したい場合は、プロジェクトのプロパティ(My Project)の[アプリケーション]タブの[ルート名前空間]を使います。



さて、この『既定のルート名前空間』なのですが、現状のように
> Module Module1
> Public Sub MySub(ByVal dat() As datt)
> ' ここに共通の処理コードを書く
> End Sub
> End Module
と書いた場合、この MySub は「WindowsApp1 名前空間の Module1 モジュールの MySub メソッド」を意味します。

このメソッドを呼び出す場合には通常、
  MySub(データ)
もしくは
  Module1.MySub(データ)
などと書いていたかと思いますが、これを名前空間を省略せずに記述する場合、
 WindowsApp1.Module1.MySub(データ)
あるいは
 Global.WindowsApp1.Module1.MySub(データ)
という呼び出しになります。


> Public Class Form1
これも同様に、この型名の前に『既定のルート名前空間』が存在します。そのため、
 Dim f As Form1
というコードがあったら、それは
 'Dim f As Global.WindowsApp1.Form1
 Dim f As WindowsApp1.Form1
と同義であるということになります。


そして、本題となる
> Public Structure datt
ですが、型の宣言というのは、それがどのファイルに書かれているのかは重要ではありません。

それが Form1.vb に書かれていようと、Form2.vb に書かれていようと、
記述が「ファイルの直下」にあるのなら、それは
 WindowsApp1.datt
という名前になっているということになります。

そして名前空間の下に、同じ名前の型が存在していると、
今回のように BC30179 エラーになってしまいます。


もしも名前空間あるいは入れ子の型までのパスが異なっていれば、
それぞれが別物として扱われます。たとえば、こういう書き方は可能です。

 'Form1.vb
 Public Class Form1
  Public Structure datt
   :
  End Structure

Dim dat(10) As datt 'これは As WindowsApp1.Form1.datt 相当
  :
 End Class
'-------------------
 'Form2.vb
 Public Class Form2
  Public Structure datt
   :
  End Structure

Dim dat(10) As datt 'これは As WindowsApp1.Form2.datt 相当
  :
 End Class


この書き方の場合、2 つの datt は別の型として扱われます。

そのため、上記のように Class の中に配置した場合、Module1 側の
> Public Sub MySub(ByVal dat() As datt)
の部分で、datt の型を解決できなくなってしまいます。

これについては、
 Public Sub MySub(ByVal dat() As Form1.datt)
 End Sub
 Public Sub MySub(ByVal dat() As Form2.datt)
 End Sub
のように、それぞれ別の型に対するオーバーロードにすることはできますが、
今回はそもそも型を分ける必要は無いので、Structure datt も一つあれば十分でしょう。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←共通のSubを複数のFormから使うには /かりん 返信無し
 
上記関連ツリー

共通のSubを複数のFormから使うには / かりん (24/04/09(Tue) 14:35) #103052
共通のSubを複数のFormから使うには / 魔界の仮面弁士 (24/04/09(Tue) 15:34) #103054 ←Now
Re[1]: 共通のSubを複数のFormから使うには / とっちゃん (24/04/09(Tue) 15:13) #103053
  └ Re[2]: 共通のSubを複数のFormから使うには / 魔界の仮面弁士 (24/04/09(Tue) 18:09) #103055
    └ Re[3]: 共通のSubを複数のFormから使うには / かりん (24/04/11(Thu) 16:12) #103057 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信