Рассмотрят следующий класс:класса и общее ограничения типа взаимодействие уровня Метода
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
или получен из него?
См. Http://stackoverflow.com/questions/8002148/c-sharp-generics-contraints-propagation. Эрик выставляет его там. –
@ Джейсон, я думаю, что он лучше читал «но». – Joey
@Joey: Достаточно справедливо. Я просто ненавижу, когда предложения начинаются с 'but', хотя использование конъюнктов для начала предложений считается правильным в наши дни. Я обвиняю своего учителя английского языка в средней школе. Он был приверженцем классических английских конвенций. –