none
Friendフィールドと名前空間と RRS feed

  • 質問

  • Windows XP SP2 + VB.net2003 SP1 + 最近までの
    Microsoft Updateで
    下記のようなプログラムを作りました。

     

    VBProjectのデフォルトの名前空間:hoge

     

    Public Class OyaClass

      Protected Class NaibuClass
        Friend x As Integer --③
      End Class
      Protected Shared y As New NaibuClass

     

      Public Overridable Sub a()

        Dim b As Integer = y.x --①

      End Sub

    End Class

    ------------------------------------------------

    Public Class KoClass
           Inherits OyaClass

     

      Public Overrides Sub a()

        Dim b As Integer = y.x --②

      End Sub

    End Class

     

    とかコーディングしたのですが、①はOKで、②は文法エラー
    でした。具体的には「yのxはPrivateなのでだめ」
    でした。
    #どう見てもFriendです!!

     

    ・Visual Basic 言語リファレンスで、
     「Friend を使用できるのは、モジュール、名前空間、
      またはファイル レベルだけです。」と有りますが、
      上記フィールドxはモジュールレベルの変数に違い
      無く、Privateにされてしまういわれは無いです。
    ・それとも、それが甘く、内部のクラスのフィールドxは
      モジュールレベル変数とは違うのでしょうか?
    ・MSオフィシャルな記事では無いですが、Sharedな変数
      は名前空間が他とは違う(プロジェクトのデフォルトの
      名前空間のHOGEでは無く、クラス名そのものが名前空間)
      とかなんとか書いてあった様に思います(?!)が、
      本当でしょうか?
    ・もし本当なら、それが理由で「同じアセンブリ」で、
      (.netでは関係ないかも知れないですが)
      「同じプロジェクト」なのに、それを参照するクラス
      とは名前空間が違うが為に、インスタンスyの中のxは、
      Friendの関係からPrivateの関係にされてしまうので
      しょうか?
    ・凡ミスなのでしょうか?

     

    なにかご教示ください。

     

    #なお、③で
    #  Public x As Integer
    #とすれば、意図通りに
    #使えました。

    2007年7月30日 15:11

すべての返信

  • そのままコピーして Visual Studio 2003 及び Visual Studio 2005 でコンパイルしてみましたが、コンパイルエラーになりませんでした。
    但し、私の環境では Visual Studio 2003 に SP1 があたっていません。

    2007年7月31日 0:40