型の上位変換 (Visual Basic)
モジュールでプログラミング要素を宣言すると、Visual Basic によって、そのスコープがモジュールを含む名前空間に昇格されます。 これは型の上位変換と呼ばれます。
次の例では、モジュールのスケルトン定義とそのモジュールの 2 つのメンバーを示しています。
Namespace projNamespace
Module projModule
Public Enum basicEnum As Integer
one = 1
two = 2
End Enum
Public Class innerClass
Shared Sub numberSub(ByVal firstArg As Integer)
End Sub
End Class
End Module
End Namespace
projModule
内で、モジュール レベルで宣言されたプログラミング要素が projNamespace
に昇格されます。 前の例では、basicEnum
と innerClass
は昇格されますが、numberSub
は、モジュール レベルで宣言されていないため、昇格されません。
型の上位変換の効果
型の上位変換の効果は、修飾文字列にモジュール名を含める必要がないことです。 次の例では、前の例のプロシージャを 2 回呼び出しています。
Sub usePromotion()
projNamespace.projModule.innerClass.numberSub(projNamespace.projModule.basicEnum.one)
projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)
End Sub
前の例では、最初の呼び出しで完全修飾文字列を使用しています。 ただし、型の上位変換のため、これは必要ありません。 2 番目の呼び出しでは、修飾文字列に projModule
を含めずに、モジュールのメンバーにアクセスしています。
型の上位変換の無効化
名前空間にモジュール メンバーと同じ名前のメンバーが既に存在する場合、そのモジュール メンバーに対して型の上位変換は無効になります。 次の例では、同じ名前空間内の列挙とモジュールのスケルトン定義を示しています。
Namespace thisNamespace
Public Enum abc
first = 1
second
End Enum
Module thisModule
Public Class abc
Public Sub abcSub()
End Sub
End Class
Public Class xyz
Public Sub xyzSub()
End Sub
End Class
End Module
End Namespace
前の例では、名前空間レベルで同じ名前を持つ列挙が既に存在するため、Visual Basic がクラス abc
を thisNameSpace
に昇格できません。 abcSub
にアクセスするには、完全修飾文字列 thisNamespace.thisModule.abc.abcSub
を使用する必要があります。 ただし、クラス xyz
は引き続き昇格され、短い修飾文字列 thisNamespace.xyz.xyzSub
で、xyzSub
にアクセスできます。
部分型の型の上位変換の無効化
モジュール内のクラスまたは構造体で Partial キーワードを使用している場合は、名前空間に同じ名前のメンバーが含まれているかどうかに関係なく、そのクラスまたは構造体に対する型の上位変換が自動的に無効になります。 モジュール内の他の要素は、引き続き型の上位変換の対象になります。
結果。 部分定義の型の上位変換の無効化によって、予期しない結果が発生したり、コンパイラ エラーが発生したりすることもあります。 次の例では、クラスのスケルトンの部分定義を示しており、そのうちの 1 つがモジュール内にあります。
Namespace sampleNamespace
Partial Public Class sampleClass
Public Sub sub1()
End Sub
End Class
Module sampleModule
Partial Public Class sampleClass
Public Sub sub2()
End Sub
End Class
End Module
End Namespace
前の例で、開発者は、コンパイラに sampleClass
の 2 つの部分定義をマージすることを期待するかもしれません。 しかし、コンパイラでは sampleModule
内の部分定義の上位変換が考慮されません。 そのため、どちらも sampleClass
という名前が付けられていますが、修飾パスが異なる 2 つの個別のクラスのコンパイルが試みられます。
コンパイラは、完全修飾されたパスがまったく同じ場合にのみ、部分定義をマージします。
推奨事項
次の推奨事項は、優れたプログラミング方法を示しています。
一意の名前。 プログラミング要素の名前付けを完全に制御できる場合は、どこでも一意の名前を使用することをお勧めします。 同一の名前は追加の修飾が必要であり、コードが読みにくくなる可能性があります。 それらは、軽度のエラーや予期しない結果につながる可能性もあります。
完全修飾。 同じ名前空間内のモジュールやその他の要素を操作する場合、最も安全な方法は、すべてのプログラミング要素に対して常に完全修飾を使用することです。 モジュール メンバーの型の上位変換が無効になっていて、そのメンバーを完全に修飾していない場合、誤って別のプログラミング要素にアクセスする可能性があります。
関連項目
.NET