T
次のように、ジェネリック型を比較できます。
Private Sub DoStuff(Of T)(ByRef list As List(Of T))
If GetType(T) = GetType(String) Then
'Do some string stuff
Else GetType(T) = GetType(Integer) Then
'Do some Integer stuff
End If
End Sub
Select
または、ブロックとして実行することもできます。
Private Sub DoStuff(Of T)(ByRef list As List(Of T))
Select GetType(T)
Case GetType(String)
'Do some string stuff
Case GetType(Integer)
'Do some Integer stuff
End Select
End Sub
言うまでもありませんが、そのようなタイプのチェックはできるだけやめて、できるだけ避けるべきであると付け加えておく必要があると思います。そのようなことを行うと、乱雑なスパゲッティ コードが発生し、ジェネリック パラメーターを使用する目的全体が無効になります。通常、このようなことをしなければならなくなったときは、何かがうまくいかず、設計を再考する必要があることを示しています。
List(Of ParentClass)
との不一致に関する限り、これはList(Of SubClass)
人々がジェネリクスに対してよくする混乱です。ジェネリックが機能する方法は、ジェネリック型パラメーターに提供できる可能な各型が、他のデータ型とはまったく関係のない、完全に別のデータ型として扱われることです。そのため、関係や共有に関係なく、まったく異なるタイプとして扱われる場合がList(Of X)
あります。つまり、基本的には、次のように新しい型を作成するための省略形です。List(Of Y)
X
Y
Public Class ListOfSubClass
Inherits List(Of SubClass)
End Class
Public Class ListOfParentClass
Inherits List(Of ParentClass)
End Class
ListOfParentClass
これを行った場合、 との互換性は期待ListOfSubClass
できません。相互に関係がないためです。同様に、ジェネリックもそのように機能するとは思わないでください。
編集
同じジェネリック クラスの異なる型の間のキャストの非互換性について私が言ったことは真実ですが、それはもはやすべての話ではありません。Visual Studio 2010 およびフレームワークの 4.0 バージョンの時点で、.NET はその問題の解決に役立つ共分散と反分散をサポートしています。詳細については、MSDN の記事を参照してください。