MatchCollectionクラスは、名前の通り複数のMatchを格納するためのコレクションクラスです。 Regex.Matchesメソッドは戻り値の型がMatchCollectionとなっていて、正規表現にマッチした箇所すべてに対応するMatchが格納された状態で返されます。

Regex.Matchesメソッドから返されるMatchCollectionには、正規表現にマッチした箇所のみを表すMatchが含まれるため、このMatchCollectionからはすべてSuccessプロパティがTrueのMatchが列挙されることになります。 そのため、個別にSuccessプロパティをチェックする必要はありません。

Regex.Matchesメソッドで正規表現にマッチする個所すべてに対応するMatchインスタンスを取得する
using System;
using System.Text.RegularExpressions;

class Sample {
  static void Main()
  {
    var text = "The quick brown fox jumps over the lazy dog";
    var pattern = @"\w{4,}"; // 4文字以上の単語

    // マッチする個所すべてを列挙
    // (MatchCollectionは非ジェネリックで型指定されていないIEnumeratorを返すため、varによる暗黙的な型指定はできない)
    foreach (Match m in Regex.Matches(text, pattern)) {
      Console.WriteLine(m.Value);
    }
  }
}
実行結果
quick
brown
jumps
over
lazy

MatchCollectionは当初、非ジェネリックなIEnumerableのみを実装した型指定されていないコレクションとして登場し、その後.NET Standard 2.1/.NET Core 2.0にてIEnumerable<Match>/ICollection<Match>/IList<Match>を実装するようになり、型指定されたコレクションとして扱うことができるようになっています。

一方、IEnumerable<Match>の実装以降でも、MatchCollection.GetEnumeratorメソッドは(おそらく)互換性のため型指定されていないIEnumeratorを返す実装のままとなっています。 このため、MatchCollectionをforeachで列挙する場合、varによる暗黙的な型指定を行うとobjectとして列挙されます

代替手法やMatchCollectionのジェネリックインターフェイスについてより詳しくは§.MatchCollection・GroupCollection・CaptureCollectionとジェネリックコレクションインターフェイスを参照してください。

MatchCollectionは当初IEnumerableのみを実装した型指定されていないコレクションとして登場し、その後.NET Standard 2.1/.NET Core 2.0にてIEnumerable<Match>/ICollection<Match>/IList<Match>を実装するようになり、型指定されたコレクションとして扱うことができるようになっています。

一方、IEnumerable<Match>の実装以降でも、MatchCollection.GetEnumeratorメソッドは(おそらく)互換性のため型指定されていないIEnumeratorを返す実装のままとなっています。 このため、MatchCollectionをforeachで列挙する場合、varによる暗黙的な型指定を行うとobjectとして列挙されます