Casting tipo genérico "as T", enquanto reforçando o tipo de T

Estou perdendo um truque aqui e não acredito que nunca fiz isso antes. No entanto, como posso converter um tipo genérico usando a palavra-chave 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;

}

A linhaT manager = session[UniqueId] as T; lança o seguinte erro:

O parâmetro de tipo 'T' não pode ser usado com o operador 'as' porque ele não possui uma restrição de tipo de classe nem uma restrição de 'classe'

Agora, acho que entendi a razão disso; Eu não disse fisicamente ao compilador que T é uma classe. Se eu substituir:

public abstract class SessionManager<T> where T : ISessionManager

com

public abstract class SessionManager<T> where T : class

... então o código é construído com sucesso.

Mas a minha pergunta é assim; Como posso ter as restrições de classe e ISessionManager no tipo genérico? Eu espero que haja uma resposta muito simples para isso.

EDITAR: Apenas para adicionar eu tentei:where T : ISessionManager, classAcontece que eu não tinha lido o erro do compilador corretamente. Simplesmente basta colocar aula antesISessionManager Corrige o problema. O erro que eu não li foi:

"A restrição 'class' ou 'struct' deve vir antes de quaisquer outras restrições".

Momento mudo acabou.

questionAnswers(3)

yourAnswerToTheQuestion