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

C#-静态类型不能用作类型参数,c#,generics,static,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

我有一个泛型类,它帮助我检查参数值

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)));
        }
    }
}
内部密封类参数
T:在哪里上课
{
私有无效跟踪和工作流(例外情况除外)
{
新的InternalTraceHelper().WriteError(ex);
掷骰子;
}
内部void ThrowNull(对象值,字符串argName)
{
if(ReferenceEquals(value,null))
{
TraceAndThrow(新ArgumentNullException(argName));
}
}
内部void ThrowIf(布尔条件,字符串argName)
{
如果(条件)
{
TraceAndThrow(新ArgumentException(null,argName));
}
}
内部void ThrowNotInEnum(类型enumType,对象值)
{
如果(!Enum.IsDefined(enumType,value))
{
TraceAndThrow(新ArgumentOutOfRangeException(Resources.ArgEnumIllegalVal.InvariantFormat(value));
}
}
}
但当我尝试将其用于静态类时:

internal static class Class1
{
    private static Argument<Class1> _arg;
}
内部静态类Class1
{
私有静态参数_arg;
}
我(在编译时)遇到了以下错误:

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


我做错了什么?

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

您做错的是使用静态类型作为泛型类型参数

因为静态类不能实例化,所以它永远不能用静态类型创建
参数。

因为静态类没有实例成员,所以我关心的是我将如何处理它们

我认为,由于不能使用静态类作为泛型参数,因此需要使用扩展方法而不是泛型类来实现这一点

这是故意的

静态类试图防止不适当的使用,所以在几乎所有的情况下,您都不能在通常需要类型的实例的情况下使用它们。。。这包括类型参数


有关可以引用静态类类型的非常有限的一组情况,请参见第节。

是否有解决方法?我怎么办?我不会在静态类中“手动”检查,在非静态类中使用
参数
。不,除了使用
系统之外没有其他方法。键入
@Arnaud,您不能将静态类型作为参数传递,因此我看不到您何时想要使用
参数
,除非我被你的类名误导了。我的静态类是非静态的,但是使用私有构造函数就可以了?因此,没有人可以实例化它,但它是非静态的。这是一个很好的方法吗?是的,这绝对是一个信息丰富的答案。你为什么要费心写这么长的文本呢?用一个私有构造函数来完成我的静态类,而不是静态类?因此,没有人可以实例化它,但它是非静态的。这是一种很好的方式吗?(谢谢这一节,我已经读过了)@Arnaud F:好吧,那会有用的——但是你用类型参数做什么呢?这有什么意义?它似乎只被
InternalTraceHelper
使用,我们不知道它是什么样子。
InternalTraceHelper
执行
Trace.Write()
,参数类型用于定义跟踪的类别。可替换为
Trace.WriteLine(“消息”,typeof(T).FullName);//其中T=Class1
@Arnaud F.:听起来您可能想要一个非通用版本的InternalTraceHelper,它采用
类型
。事实上,您可以使整个类成为非泛型类,只需使用泛型方法来简化创建:
InternalTraceHelper.Create
将调用
newinternalTraceHelper(typeof(T))
其中
T
是该方法的类型参数。非常感谢tip Master!这是不正确的。ILogger是一个示例,其中该类成为记录器在发出诊断时要使用的类别。这是一条愚蠢的规则。@Quarkly,你找到解决办法了吗?现在考虑让类成为非静态的