Рассмотрим следующий класс:
public class DerivedClassPool<TBase> where TBase : class
{
public TBase Get(Type componentType)
{
// Not important, but you get the idea
return Activator.CreateInstance(componentType) as TBase;
}
public TDerived SomeMethod<TDerived>() where TDerived : TBase
{
return Get(typeof(TBase)) as TDerived;
}
}
Обратите внимание, что я ограничил аргумент универсального класса TBase
как класс: , где TBase: class
Я также ограничил аргумент универсального метода TDerived
как TBase
или что-то производное от этого: где Получено: TBase
.
Я получаю сообщение об ошибке в строке as TDerived
:
Параметр типа TDerived нельзя использовать с оператором as, поскольку он не имеет ограничения типа класса или класса 'constraint
Я понимаю, что для предотвращения ошибки мне нужно добавить ограничение class
, чтобы получить:
where TDerived : class, TBase
Почему я должен это делать, когда TBase
уже должен быть классом, а TDerived
должен быть TBase
или производным от него?