Partager via


Ne pas déclarer de membres statiques sur les types génériques

Mise à jour : novembre 2007

TypeName

DoNotDeclareStaticMembersOnGenericTypes

CheckId

CA1000

Catégorie

Microsoft.CSharp

Modification avec rupture

Oui

Cause

Un type générique visible de l'extérieur contient un membre static (Shared en Visual Basic).

Description de la règle

Lorsqu'un membre static d'un type générique est appelé, l'argument de type doit être spécifié pour le type. Lorsqu'un membre d'instance générique qui ne prend pas en charge l'inférence est appelé, l'argument de type doit être spécifié pour le membre. La syntaxe permettant de spécifier l'argument de type dans ces deux cas est différente et peut être facilement confondue, comme l'illustrent les appels suivants :

' Shared method in a generic type.
GenericType(Of Integer).SharedMethod()

' Generic instance method that does not support inference.
someObject.GenericMethod(Of Integer)()
// Static method in a generic type.
GenericType<int>.StaticMethod();

// Generic instance method that does not support inference.
someObject.GenericMethod<int>();

En général, les deux déclarations précédentes doivent être évitées afin que l'argument de type ne soit pas spécifié lors de l'appel au membre. On obtient une syntaxe d'appel aux membres pour les génériques qui est identique à celle pour les non-génériques. Pour plus d'informations, consultez Les méthodes génériques doivent fournir le paramètre de type.

Comment corriger les violations

Pour corriger une violation de cette règle, supprimez le membre statique ou remplacez-le par un membre d'instance.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle. La fourniture de génériques dans une syntaxe facile à comprendre et à utiliser réduit le délai d'apprentissage nécessaire et augmente le taux d'adoption de nouvelles bibliothèques.

Exemple

L'exemple suivant montre une méthode qui provoque cette violation.

Imports System
Imports System.Runtime.InteropServices

Namespace Samples

    Public NotInheritable Class EnumParser(Of T)

        Private Sub New()
        End Sub

        ' Fires this violation        
        Public Shared Function TryParse(ByVal value As String, <Out()> ByRef result As T) As Boolean

            Try
                result = DirectCast([Enum].Parse(GetType(T), value), T)
                Return True
            Catch ex As ArgumentException
            End Try

            result = Nothing
            Return False

        End Function

    End Class

    Module Program

        Public Sub Main()

            Dim result As DayOfWeek
            ' Must specify type argument            
            If EnumParser(Of DayOfWeek).TryParse("Monday", result) Then
                Console.WriteLine("Conversion Succeeded!")
            End If

        End Sub

    End Module

End Namespace
using System;

namespace Samples
{    
    public static class EnumParser<T>    
    {        // Fires this violation        
        public static bool TryParse(string value, out T result)        
        {            
            try            
            {                
                result = (T)Enum.Parse(typeof(T), value);                
                return true;            
            }            
            catch (ArgumentException)            
            {            
            }
                result = default(T);            
            return false;        
        }    
    }

    static class Program    
    {        
        public static void Main()        
        {            
            DayOfWeek dayOfWeek;            
            // Must specify type argument            
            if (EnumParser<DayOfWeek>.TryParse("Monday", out dayOfWeek))            
            {                
                Console.WriteLine("Conversion Succeeded!");            
            }        
        }    
    }
}

Dans l'exemple précité, déclarer un membre statique sur un type générique force l'utilisateur à spécifier l'argument de type lors de son appel.

L'exemple suivant résout la violation précitée en déplaçant le paramètre de type, T, de la classe à la méthode, ce qui lui permet d'être déduit par le compilateur lorsqu'il est appelé.

Règles connexes

Éviter les paramètres excessifs sur les types génériques

Les collections doivent implémenter l'interface générique

Ne pas exposer de listes génériques

Ne pas imbriquer les types génériques dans les signatures de membre

Les méthodes génériques doivent fournir le paramètre de type

Utiliser des instances du gestionnaire d'événements génériques

Utiliser des classes génériques lorsque nécessaire

Voir aussi

Référence

Génériques (Guide de programmation C#)