web-dev-qa-db-ja.com

C#-静的型は型引数として使用できません

私はジェネリッククラスを持っているので、引数の値をチェックするのに役立ちます

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;
}

(コンパイル時に)このエラーが発生しました:

静的型は型引数として使用できません

私は何を間違っていますか?

26
Arnaud F.

これは意図的なものです。

静的クラスは不適切な使用を防止しようとするため、ほとんどすべての状況で、通常はinstanceが必要な状況でそれらを使用できません。 type ...そして、それは型引数を含みます。

静的クラス型を参照できる非常に限られた状況については、 C#4仕様 のセクション10.1.1.3.1を参照してください。

30
Jon Skeet

ジェネリックスはインスタンスでのみ機能し、静的クラスでは機能しません。

5
Daniel A. White

静的クラスはインスタンス化できないため、静的タイプでArgument<T>を作成することはできません。

2
Bala R

間違っているのは、静的型をジェネリック型引数として使用していることです。

0
Mark Cidade

静的クラスにはインスタンスメンバーがないので、私が心配するのは、それらをどのように処理するかです。

静的クラスをジェネリック引数として使用できないことを忘れて、ジェネリッククラスの代わりに拡張メソッドを使用する必要があると思います。

0