Ваша проблема не в ограничении
where T : IClient
а скорее при использовании вашего Списка.
Вы не можете сказать это:
IList<T> clients = new List<T>();
clients.Add( new Client(3));
Вы МОЖЕТЕ сказать следующее: (это предполагает, что ваше ограничение включает «новое»)
IList<T> clients = new List<T>();
clients.Add( new T());
в этом случае ваше ограничение должно быть:
where T : new(), IClient
или вы можете сделать это, но он вообще не будет использовать дженерики:
IList<T> clients = new List<Client>();
clients.Add( new Client(3));
Причина, по которой вы не можете сделать то, что вы пытаетесь сделать, заключается в том, что компилятор не может гарантировать, что тип T будет иметь тип Client, поэтому он дает вам ошибку компилятора. Это не имеет ничего общего с вашим ограничением на самом деле.