Приведение универсального типа «как T» при одновременном применении типа T
Мне здесь не хватает уловки, я думаю и не могу поверить, что я никогда не делал этого раньше. Однако как я могу привести универсальный тип, используя ключевое слово 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;
}
ЛинияT manager = session[UniqueId] as T;
выдает следующую ошибку:
Параметр типа «T» нельзя использовать с оператором «as», поскольку он не имеет ограничения типа класса или ограничения «class»
Теперь, я думаю, понять причину этого; Я физически не говорил компилятору, что T - это класс. Если я заменю:
public abstract class SessionManager<T> where T : ISessionManager
с участием
public abstract class SessionManager<T> where T : class
... тогда код строится успешно.
Но мой вопрос таков; Как я могу иметь и класс и принудительное применение ISessionManager для универсального типа? Я надеюсь, что есть очень простой ответ на это.
РЕДАКТИРОВАТЬ: Просто чтобы добавить, я пытался:where T : ISessionManager, class
Оказывается, я не прочитал мою ошибку компилятора должным образом. Достаточно просто, просто поставить класс передISessionManager
устраняет проблему Ошибка, которую я не читал, была:
«Ограничение« класс »или« структура »должно предшествовать любым другим ограничениям».
Тупой момент окончен.