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, class
Acontece 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.