C# - 静态类型不能用作类型参数

时间:2011-05-02 14:46:39

标签: c# generics static

我有一个泛型类,可以帮助我对参数值进行检查

internal sealed class Argument<T>
    where T : class
{
    private void TraceAndThrow(Exception ex)
    {
        new InternalTraceHelper<T>().WriteError(ex);
        throw ex;
    }

    internal void ThrowNull(object value, string argName)
    {
        if (ReferenceEquals(value, null))
        {
            TraceAndThrow(new ArgumentNullException(argName));
        }
    }

    internal void ThrowIf(bool condition, string argName)
    {
        if (condition)
        {
            TraceAndThrow(new ArgumentException(null, argName));
        }
    }


    internal void ThrowNotInEnum(Type enumType, object value)
    {
        if (!Enum.IsDefined(enumType, value))
        {
            TraceAndThrow(new ArgumentOutOfRangeException(Resources.ArgEnumIllegalVal.InvariantFormat(value)));
        }
    }
}

但是当我尝试将它与静态类一起使用时:

internal static class Class1
{
    private static Argument<Class1> _arg;
}

我收到了这个错误(编译时):

  

静态类型不能用作类型参数

我做错了什么?

5 个答案:

答案 0 :(得分:29)

这是故意的。

静态类试图阻止不当使用,因此在几乎所有情况下,您都不能在通常需要类型的实例的情况下使用它们...并且包括类型参数。

请参阅C# 4 spec的第10.1.1.3.1节,了解可以引用静态类类型的非常有限的情况。

答案 1 :(得分:5)

泛型只适用于实例,而不适用于静态类。

答案 2 :(得分:2)

由于静态类无法实例化,因此永远不能使用静态类型创建Argument<T>

答案 3 :(得分:0)

你做错了是使用静态类型作为泛型类型参数。

答案 4 :(得分:0)

由于静态类不会有实例成员,我担心的是我将要用它做什么样的事情。

我相信,错过了你不能使用静态类作为泛型参数,我相信你需要使用扩展方法而不是泛型类。