独自に定義した型は通常そのままではソートできません。 この場合、ソートができないことを表す例外InvalidOperationExceptionがスローされます。

List.Sortでソートできない場合
Imports System
Imports System.Collections.Generic

' 独自に定義した型
Class Account
  Public Name As String

  Public Sub New(ByVal name As String)
    Me.Name = name
  ENd Sub
End Class

Class Sample
  Shared Sub Main()
    ' ソート対象のList
    Dim list As New List(Of Account)(New Account() {New Account("Bob"), New Account("Alice"), New Account("Charlie")})

    ' ソート
    list.Sort()
  End Sub
End Class
実行結果
System.InvalidOperationException: 配列にある 2 つの要素を比較できませんでした。 ---> System.ArgumentException: 少なくとも 1 つのオブジェクトで IComparable を実装しなければなりません。
   場所 System.Collections.Comparer.Compare(Object a, Object b)
   場所 System.Collections.Generic.ObjectComparer`1.Compare(T x, T y)
   場所 System.Collections.Generic.ArraySortHelper`1.SwapIfGreaterWithItems(T[] keys, IComparer`1 comparer, Int32 a, Int32 b)
   場所 System.Collections.Generic.ArraySortHelper`1.QuickSort(T[] keys, Int32 left, Int32 right, IComparer`1 comparer)
   場所 System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
   --- 内部例外スタック トレースの終わり ---
   場所 System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
   場所 System.Array.Sort[T](T[] array, Int32 index, Int32 length, IComparer`1 comparer)
   場所 System.Collections.Generic.List`1.Sort(Int32 index, Int32 count, IComparer`1 comparer)
   場所 Sample.Main()

これはソート対象の大小関係が定義されていないために発生します。 ソートを行うためにはソート対象の大小関係が比較できなければなりませんが、上記の例ではAccountクラスの大小関係がどこにも定義されておらず比較ができないため、ソートの際に例外が発生しています。

List.Sortメソッドでソートを行うには、ソート対象の型にIComparable<T>(またはIComparable)インターフェイスを実装するか、あるいはSortメソッドの引数にIComparer<T>(またはIComparer)インターフェイス、もしくはComparison<T>デリゲートを指定する必要があります。

詳しくは複合型のソート・複数キーでのソートを参照してください。 また個々のインターフェイスとその実装方法については大小関係の定義と比較を参照してください。

MENTAにてテキストチャットによるサポートを行っています。 問題の解決法をお探しの方や.NET/C#を学習中の方はどうぞご利用ください。