在强制执行T类型的同时,将通用类型“强制转换为T”

我想在这里错过了一个技巧,我不敢相信我以前从未这样做过。 但是,如何使用as关键字转换generics类型?

[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().ToString(); } // Get the object from session T manager = session[UniqueId] as T; if (manager == null) { manager = Activator.CreateInstance(); session[UniqueId] = manager; } return manager; } protected static string UniqueId = null; } 

T manager = session[UniqueId] as T; 抛出以下错误:

类型参数“T”不能与“as”运算符一起使用,因为它没有类类型约束,也没有“类”约束

现在,我认为理解这个的原因; 我没有亲自告诉编译器T是一个类。 如果我更换:

 public abstract class SessionManager where T : ISessionManager 

 public abstract class SessionManager where T : class 

…然后代码构建成功。

但我的问题是这样的; 如何在generics类型上同时具有类和ISessionManager强制? 我希望有一个非常简单的答案。

编辑:只是添加我试过: where T : ISessionManager, class ,结果我没有正确读取我的编译器错误。 简单地说,只需在ISessionManager之前放置类就可以解决问题。 我没看过的错误是:

“’类’或’结构’约束必须先于任何其他约束”。

愚蠢的时刻结束。

 ... where T : class, ISessionManager 

如果你想在这里使用where keyword ,那么这个例子也是使用generics的

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

你可以走得更远

 where T : class, ISessionManager, new() 

这将迫使非抽象类与无参数ctor一起作为T传递

阅读C#中关于类型参数的约束 。

在这种特殊情况下,您必须确保T是一个类:

 public abstract class SessionManager where T : class, ISessionManager