Casting genérico tipo "como T" mientras se hace cumplir el tipo de T

Me falta un truco. Creo que no puedo creer que nunca haya hecho esto antes. Sin embargo, ¿cómo puedo emitir un tipo genérico utilizando la palabra clave 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;

}

La líneaT manager = session[UniqueId] as T; arroja el siguiente error:

El parámetro de tipo 'T' no puede usarse con el operador 'como' porque no tiene una restricción de tipo de clase ni una restricción de 'clase'

Ahora, creo que entiendo la razón de esto; No le he dicho físicamente al compilador que T es una clase. Si sustituyo:

public abstract class SessionManager<T> where T : ISessionManager

con

public abstract class SessionManager<T> where T : class

... entonces el código se construye con éxito.

Pero mi pregunta es así; ¿Cómo puedo tener las implementaciones de clase e ISessionManager en el tipo genérico? Espero que haya una respuesta muy simple para esto.

EDITAR: Solo para agregar lo he intentado:where T : ISessionManager, class, resulta que no había leído el error de mi compilador correctamente. Simplemente basta con poner la clase antesISessionManager Soluciona el problema. El error que no había leído era:

"La restricción 'clase' o 'estructura' debe venir antes que cualquier otra restricción".

Momento tonto terminado.

Respuestas a la pregunta(3)

Su respuesta a la pregunta