【问题标题】:Casting generic type "as T" whilst enforcing the type of T在强制 T 类型的同时强制转换泛型类型“as T”
【发布时间】: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&lt;T&gt;。您应该添加一个new() 约束并在代码中简单地使用new T()
  • 从来不知道!谢谢。

标签: c# asp.net generics


【解决方案1】:
... where T : class, ISessionManager

如果您想在方法上使用 where keyword,这里是一个也使用泛型的示例

    public void store<T>(T value, String key)
    {
        Session[key] = value;
    }

    public T retrieve<T>(String key) where T:class
    {
        return  Session[key] as T ;
    }

【讨论】:

  • Ar**。我一直在写 where T : ISessionManager, class!
【解决方案2】:
where T : class, ISessionManager

你可以走得更远

where T : class, ISessionManager, new()

这将强制将具有无参数ctor的非抽象类作为T上交

【讨论】:

    【解决方案3】:

    阅读Constraints on Type Parameters in C#

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

    public abstract class SessionManager<T>
        where T : class, ISessionManager
    

    【讨论】:

    • 这不会建立。 ;) 必须先上课。另外,必须在单个 where 子句中指定特定类型的所有约束...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多