1 行目ICollection<User> users = new Collection<User>();
は、ICollection インターフェイスを実装するオブジェクト (コレクション) へのCollection<User> users = new Collection<User>();
参照を作成します。2 行目は、T = User である Collection クラスの具体的な実装であるオブジェクトへの参照を作成します。
使用法では、後続のコードが処理するコレクションのタイプに依存しない必要がある ICollection 参照を使用するように見えます。つまり、ICollection を実装する任意のオブジェクトを提供でき、コードは引き続き機能します。コードが密結合されていない場合に最適です (もちろん、これは私たち全員が望んでいます)。
Collection を参照として使用すると、処理コードが ICollection の特定の実装である Collection クラスに緊密に結合されます。インターフェイスで定義されたメソッドのみを使用することもできますが、クラスの特定の機能を使用することもできます。コレクションオブジェクトを別のものに簡単に置き換えることができます。これには十分な理由がありますが、ここでの回答の範囲を少し超えています。ここで依存性注入と制御の反転を検索してください。背景情報がたくさん見つかると確信しています。