【发布时间】:2009-11-12 12:06:01
【问题描述】:
我认为我在这里错过了一个技巧,不敢相信我以前从未这样做过。但是,如何使用 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”运算符,因为它确实 没有类类型约束,也没有 “类”约束
现在,我想明白其中的原因了;我没有实际告诉编译器 T 是一个类。如果我更换:
public abstract class SessionManager<T> where T : ISessionManager
与
public abstract class SessionManager<T> where T : class
...然后代码构建成功。
但是我的问题是这样的;如何在泛型类型上同时执行类和 ISessionManager 强制?我希望有一个非常简单的答案。
编辑:
只是补充一下我试过:where T : ISessionManager, class,结果我没有正确阅读我的编译器错误。很简单,只需将课程放在ISessionManager 之前即可解决问题。我没有读到的错误是:
"'class' 或 'struct' 约束 必须先于任何其他 约束”。
愚蠢的时刻结束了。
【问题讨论】:
-
顺便说一句,你不应该在这里使用
CreateInstance<T>。您应该添加一个new()约束并在代码中简单地使用new T()。 -
从来不知道!谢谢。