Рассмотрим следующий класс:
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
как класс: where TBase : class
Я также ограничил TDerived
универсальный аргумент метода должен быть TBase
или что-то полученное из этого: where TDerived : TBase
.
В строке as TDerived
появляется ошибка:
Параметр типа 'TDerived'не может использоваться с оператором «как», потому что у него нет ограничения типа класса или ограничения «класса»
Я понимаю, что для предотвращения ошибки мне нужно добавить ограничение class
,поэтому я получил бы:
where TDerived : class, TBase
Почему я должен это делать, когда TBase
уже ограничен, чтобы быть классом, а TDerived
ограничен, чтобы быть TBase
или производнымот этого?