Couler le type générique “comme T” tout en imposant le type de T

Il me manque un truc ici et je ne peux pas croire que je n’ai jamais fait cela auparavant. Cependant, comment puis-je convertir un type générique à l’aide du mot clé as?

[Serializable] public abstract class SessionManager where T : ISessionManager { protected SessionManager() { } public static T GetInstance(HttpSessionState session) { // Ensure there is a session Id if (UniqueId == null) { UniqueId = Guid.NewGuid().ToSsortingng(); } // Get the object from session T manager = session[UniqueId] as T; if (manager == null) { manager = Activator.CreateInstance(); session[UniqueId] = manager; } return manager; } protected static ssortingng UniqueId = null; } 

La ligne T manager = session[UniqueId] as T; renvoie l’erreur suivante:

Le paramètre de type ‘T’ ne peut pas être utilisé avec l’opérateur ‘as’ car il n’a pas de contrainte de type classe ni de contrainte ‘classe’

Maintenant, je pense comprendre la raison de cela; Je n’ai pas physiquement dit au compilateur que T est une classe. Si je remplace:

 public abstract class SessionManager where T : ISessionManager 

avec

 public abstract class SessionManager where T : class 

… alors le code est construit avec succès.

Mais ma question est donc: comment puis-je avoir à la fois les applications de classe et ISessionManager sur le type générique? J’espère qu’il y a une réponse très simple à cela.

EDIT: Juste pour append que j’avais essayé: where T : ISessionManager, class , s’avère que je n’ai pas lu correctement mon erreur de compilation. Il suffit simplement de mettre classe avant ISessionManager pour ISessionManager le problème. L’erreur que je n’avais pas lue était:

“La contrainte ‘class’ ou ‘struct’ doit précéder toute autre contrainte”.

Moment muet fini.

 ... where T : class, ISessionManager 

Si vous voulez utiliser le keyword where sur méthodes, voici un exemple qui utilise également des génériques

  public void store(T value, Ssortingng key) { Session[key] = value; } public T resortingeve(Ssortingng key) where T:class { return Session[key] as T ; } 
 where T : class, ISessionManager 

tu peux aller encore plus loin

 where T : class, ISessionManager, new() 

cela forcera la classe non abstraite avec ctor sans paramètre à être remis en tant que T

Lire sur les contraintes sur les parameters de type en C # .

Dans ce cas particulier, vous devez vous assurer que T est une classe:

 public abstract class SessionManager where T : class, ISessionManager