Приведение универсального типа «как T» при одновременном применении типа T

Мне здесь не хватает уловки, я думаю и не могу поверить, что я никогда не делал этого раньше. Однако как я могу привести универсальный тип, используя ключевое слово as?

[Serializable]
public abstract class SessionManager<T> where T : ISessionManager
{

    protected SessionManager() { }

    public static T GetInstance(HttpSessionState session)
    {

        // Ensure there is a session Id
        if (UniqueId == null)
        {
            UniqueId = Guid.NewGuid().ToString();
        }

        // Get the object from session
        T manager = session[UniqueId] as T;
        if (manager == null)
        {
            manager = Activator.CreateInstance<T>();
            session[UniqueId] = manager;
        }

        return manager;

    }

    protected static string UniqueId = null;

}

ЛинияT manager = session[UniqueId] as T; выдает следующую ошибку:

Параметр типа «T» нельзя использовать с оператором «as», поскольку он не имеет ограничения типа класса или ограничения «class»

Теперь, я думаю, понять причину этого; Я физически не говорил компилятору, что T - это класс. Если я заменю:

public abstract class SessionManager<T> where T : ISessionManager

с участием

public abstract class SessionManager<T> where T : class

... тогда код строится успешно.

Но мой вопрос таков; Как я могу иметь и класс и принудительное применение ISessionManager для универсального типа? Я надеюсь, что есть очень простой ответ на это.

РЕДАКТИРОВАТЬ: Просто чтобы добавить, я пытался:where T : ISessionManager, classОказывается, я не прочитал мою ошибку компилятора должным образом. Достаточно просто, просто поставить класс передISessionManager устраняет проблему Ошибка, которую я не читал, была:

«Ограничение« класс »или« структура »должно предшествовать любым другим ограничениям».

Тупой момент окончен.

Ответы на вопрос(3)

Ваш ответ на вопрос