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

Arn*_* F. 25 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)));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

internal static class Class1
{
    private static Argument<Class1> _arg;
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误(在编译时):

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

我做错了什么?

Jon*_*eet 31

这是故意的.

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

有关可以引用静态类类型的非常有限的一组情况,请参阅C#4规范的 10.1.1.3.1节.

  • @Arnaud F.:听起来你可能想要一个非通用版本的InternalTraceHelper,它取代了`Type`.事实上,你可以使整个类非泛型,只需使用泛型方法使创建更简单:`InternalTraceHelper.Create <Foo>`将调用`new InternalTraceHelper(typeof(T))`其中`T`是类型方法的参数. (6认同)
  • 非常感谢小费大师! (2认同)

Dan*_*ite 5

泛型仅适用于实例,而不适用于静态类.