web-dev-qa-db-fra.com

C # - les types statiques ne peuvent pas être utilisés comme arguments de type

J'ai une classe générique, qui m'aide à faire des vérifications sur les valeurs d'arguments

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

Mais quand j'essaye de l'utiliser avec une classe statique:

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

J'ai eu cette erreur (à la compilation):

les types statiques ne peuvent pas être utilisés comme arguments de type

Qu'est-ce que je fais mal?

21
Arnaud F.

C'est délibéré.

Les classes statiques essaient d'empêcher toute utilisation inappropriée. Ainsi, dans presque toutes les situations, vous ne pouvez pas les utiliser dans des situations où vous souhaiteriez normalement une instance du type ... et incluant des arguments de type.

Reportez-vous à la section 10.1.1.3.1 de la spécification C # 4 pour connaître l'ensemble très limité de situations dans lesquelles vous pouvez faire référence à des types de classe statiques.

26
Jon Skeet

Les génériques fonctionnent uniquement avec des instances, pas avec des classes statiques.

5
Daniel A. White

Comme les classes statiques ne peuvent pas être instanciées, il ne peut jamais créer Argument<T> avec un type statique.

1
Bala R

Étant donné que les classes statiques n'auront pas de membres d'instance, ma préoccupation serait de savoir quel type de chose je vais faire avec elles.

Je crois que, manquant le fait que vous ne pouvez pas utiliser les classes statiques comme arguments génériques, je pense que vous devez le faire avec des méthodes d'extension au lieu d'une classe générique.

0