Обобщения, где 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
принимаются?