2009-02-17 8 views
3

J'ai essayé de créer un contrôle abstrait pour gérer une partie de l'état dans notre application. Cependant, j'ai couru une faute de quelques issues de CLS et espérais que quelqu'un pourrait fournir un aperçu.Comprendre la conformité CLS et le code correct

J'ai une énumération en tant que tel:

<Flags()> _ 
Public Enum FormState 
    Read = 1 
    Edit = 2 
    Insert = 4 
End Enum 

Et une classe en tant que telle:

Public MustInherit Class Fields 
    Inherits System.Web.UI.UserControl 

    Public Property State() As Enumerators.FormState 
     Get 
      Return _State 
     End Get 

     Set(ByVal value As Enumerators.FormState) 
      _State = value 
      ToggleState(value) 
     End Set 
    End Property 

    Protected MustOverride Sub ToggleState(ByVal state As FormState) 
End Class 

Lorsque je tente de compiler ce code, je suis parti avec un avertissement que le Etat propriété n'est pas compatible CLS et l'argument state non plus. Comment venir? Et comment puis-je corriger ce problème pour supprimer les avertissements?

  • J'ai essayé d'ajouter le < CLSCompliant (True)> attribut à deux éléments sans chance
  • J'ai essayé de diffuser l'article MSDN Non-CLS-compliant 'MustOverride' member is not allowed in a CLS-compliant dans le code avec aucun résultat
  • I » avons essayé de changer les accesseurs Friend au lieu de Public
  • J'ai essayé spécifier un type pour le Enum (Integer et UInteger)
+0

Si vous allez juste ignorer les avertissements, pourquoi vous souciez-vous CLS en premier lieu? – MichaelGG

+0

Je me demande pareil. –

+3

Je préfèrerais comprendre les avertissements et ce qu'ils signifient alors les avoir directement supprimés/ignorés. Désolé pour tout malentendu. –

Répondre

5

En regardant votre code, l'énumération semble faire partie d'une classe appelée énumérateurs. La classe n'est pas répertoriée dans votre code, mais je suppose que vous avez un contrôle total sur elle.

La classe doit également être étiquetée avec l'attribut CLS.

1

Pour supprimer les avertissements ajouter les attributs suivants afin que l'aspect classe, la méthode et la propriété comme ceci:

<CLSCompliant(False)> _ 
Public MustInherit Class Fields 
    Inherits System.Web.UI.UserControl 

    <CLSCompliant(False)> _ 
    Public Property State() As Enumerators.FormState 
     Get 
      Return _State 
     End Get 

     Set(ByVal value As Enumerators.FormState) 
      _State = value 
      ToggleState(value) 
     End Set 
    End Property 

    <CLSCompliant(False)> _ 
    Protected MustOverride Sub ToggleState(ByVal state As FormState) 
End Class 

Cela signifie au compilateur que vous voulez que les avertissements supprimés et que vous êtes au courant de votre code n'est pas conforme CLSC.

+2

Ce n'est pas seulement un avertissement! Vous êtes en train de dire au code qu'il ne peut pas s'exécuter en confiance moyenne ou n'importe où ailleurs que la conformité CLSC est requise. De nombreux scanners de sécurité pour exécuter une application l'empêcheraient de se charger même en raison de la définition de cet attribut. –

0

Il se pourrait que vous ne disposez pas d'un élément avec la valeur 0.

Questions connexes