Дженерики, где T - интерфейс реализации класса

У меня есть интерфейс:

interface IProfile { ... }

... и класс:

[Serializable]
class Profile : IProfile 
{ 
  private Profile()
  { ... } //private to ensure only xmlserializer creates instances
}

... и менеджер с методом:

class ProfileManager
{
  public T Load<T>(string profileName) where T : class, IProfile
  {
    using(var stream = new .......)
    {
      var ser = new XmlSerializer(typeof(T));
      return (T)ser.Deserialize(stream);
    }
  }
}

Я ожидаю, что метод будет использоваться следующим образом:

var profile = myManager.Load<Profile>("TestProfile"); // class implementing IProfile as T

... и выдайте ошибку времени компиляции:

var profile = myManager.Load<IProfile>("TestProfile"); // NO! IProfile interface entered!

Однако все компилируется, и только XmlSerializer.

Я думал, что where T : class будет обеспечивать только принятые типы классов?

Можно ли сделать ошибку компилятора, если введен IProfile (или другие интерфейсы, наследуемые от IProfile), и принимаются только классы, реализующие IProfile?

Ответ 1

Согласно MSDN класс означает, что T должен быть ссылочным типом; это относится также к любому классу, интерфейсу, делегированию или типу массива.

Одна работа должна заключаться в том, чтобы потребовать, чтобы T реализовал конструктор с меньшим значением, чем:

where T : class, IProfile, new()