Casting generic type „as T”, wymuszając typ T

Brakuje mi tutaj triku, myślę i nie mogę uwierzyć, że nigdy wcześniej tego nie robiłem. Jak jednak mogę rzucić typ ogólny za pomocą słowa kluczowego 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;

}

LiniaT manager = session[UniqueId] as T; generuje następujący błąd:

Parametru typu „T” nie można używać z operatorem „as”, ponieważ nie ma on ograniczenia typu klasy ani ograniczenia „klasy”

Teraz myślę, że rozumiem powód tego; Nie powiedziałem fizycznie kompilatorowi, że T jest klasą. Jeśli wymienię:

public abstract class SessionManager<T> where T : ISessionManager

z

public abstract class SessionManager<T> where T : class

... wtedy kod buduje się pomyślnie.

Ale moje pytanie jest takie; w jaki sposób mogę mieć zarówno wymuszenia klasy i ISessionManager na typie ogólnym? Mam nadzieję, że jest na to bardzo prosta odpowiedź.

EDYTOWAĆ: Aby dodać, próbowałem:where T : ISessionManager, class, okazało się, że nie odczytałem poprawnie mojego kompilatora. Po prostu wystarczy umieścić klasę wcześniejISessionManager rozwiązuje problem. Błąd, którego nie przeczytałem, brzmiał:

„Ograniczenie„ class ”lub„ struct ”musi występować przed jakimikolwiek innymi ograniczeniami”.

Głupia chwila.

questionAnswers(3)

yourAnswerToTheQuestion