Das Verständnis CLS-Kompatibilität und korrekter Code
-
05-09-2019 - |
Frage
Ich habe versucht, eine abstrahierte Kontrolle zu schaffen, um einen Teil des Staates in unserer Anwendung zu verwalten. Ich habe jedoch ein Foul von einigen CLS Probleme laufen und hatte gehofft, dass jemand einen Einblick bieten könnte.
Ich habe eine Aufzählung als solche:
<Flags()> _
Public Enum FormState
Read = 1
Edit = 2
Insert = 4
End Enum
Und eine Klasse als solche:
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
Wenn ich versuche, diesen Code zu kompilieren ich mit einer Warnung gelassen bin, dass die Staat Eigenschaft ist nicht CLS-kompatibel und weder ist die Staat Argument. Woher? Und wie kann ich dieses Problem beheben, die Warnungen zu entfernen?
- ich versucht habe die
Attribut für beide Elemente ohne Glück hinzufügen
- Ich habe versucht, im MSDN-Artikel Nicht-CLS-kompatibel zu verbreiten 'Mustoverride' Element in einem nicht erlaubt CLS-kompatibel in den Code ohne Ergebnisse
- Ich habe die Accessoren versucht Wechsel statt
Friend
Public
- Ich habe versucht, einen Typ für die Enum (
Integer
undUInteger
) Angabe
Lösung
in Ihrem Code Blick scheint die Enum Teil einer Klasse namens Enumeratoren zu sein. Die Klasse ist in Ihrem Code aufgeführt, aber ich gehe davon aus, dass Sie die volle Kontrolle über sie haben.
Die Klasse muss auch mit dem CLS-kompatibel Attribute markiert werden.
Andere Tipps
die Warnungen entfernen fügen Sie die folgenden Attribute, so dass die Klasse, Methode und Eigenschaft wie folgt aussehen:
<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
Dies bedeutet für den Compiler, dass Sie die Warnungen entfernt wollen und dass Sie bewusst Ihren Code nicht CLSCompliant ist.
Es könnte sein, dass Sie nicht ein Element haben mit dem Wert 0.