Взаимодействие ограничений универсального типа на уровне класса и метода

Рассмотрим следующий класс:

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 или производным от него?

8
задан Jason Down 17 January 2012 в 16:54
поделиться