none
Enumeration RRS feed

  • Frage

  • Hallo,
    ich habe in einer Klasse eine Enumeration erzeugt.

      Private Enum Alignment
        left
        centric
        right
      End Enum
     
    Die Variable
    Dim startAlignment As Alignment
    erhält einen Wert:
    startAlignment = Alignment.left

    Jetzt will ich die Variable auswerten:
    If startAlignment = Alignment.left Then

    Dies funktioniert nicht. Eine Auswertung ist nur so möglich:
    If startAlignment = 1 Then

    Was muss ich ändern, damit eine Auswertung wie eigentlich gedacht möglich ist?
    If startAlignment = Alignment.left Then


    Alexander

    Donnerstag, 30. Dezember 2010 23:01

Antworten

  • Hallo Alexander,

    ich weis nicht was Du geschrieben hast. Bei mir funktioniert das einwandfrei. Alle Abfragen und die Anweisungen werden korrekt ausgeführt. Am besten kopierst Du diesen Code in ein Console Projekt und probierst es selber. Im zweiten Teil dieses Codes habe ich noch einige Möglichkeiten aufgezeigt wie man enums konvertieren kann. Vielleicht ist das hilfreich.

    Frohes neues Jahr und viele Grüße Ellen

    Module Module1
      Private Enum Alignment
        Left
        centric
        Right
      End Enum
      Sub Main()
    
        Dim startAlignment As Alignment
        'erhält einen Wert:
        startAlignment = Alignment.left
    
        '
        If startAlignment = Alignment.Left Then
          startAlignment = Alignment.centric
        End If ' OK geht
    
        '
        If startAlignment = 1 Then
          startAlignment = Alignment.Right
        End If ' OK geht auch
    
        '
        If startAlignment = Alignment.Left Then
          startAlignment = Alignment.Right
        End If ' OK geht
    
        'Konvertierungen und Operationen mit enum
        For Each al As Alignment In [Enum].GetValues(GetType(Alignment))
          Console.WriteLine("alignment: {0} /binärer Wert: {1} /logischer Vergleich: {2} /text: {3}", _
                   al, _
                   CType(al, Integer), _
                   startAlignment = al, _
                   al.ToString)
        Next
    
        'Umwandlung zurück in ein Enum-Element aus einem String.
        Dim s As String = "Left"
        startAlignment = DirectCast([Enum].Parse(GetType(Alignment), s), Alignment)
        Console.WriteLine("string: {0} /alignment: {1}", s, startAlignment)
        Console.ReadLine()
    
      End Sub
    
    End Module
    

    Ich benutze/ I'm using VB2008 & VB2010
    Samstag, 1. Januar 2011 15:54
  • Innerhalb der Enumeration Alignment erhält der Wert left den Wert 1. Ich würde aber gerne die Variable startAlignment nicht nach 1,2 oder 3
    Alexander,
    also erstens beginnt in .NET default ein Enum bei 0  (zero) aufsteigend:
    Enum-Anweisung (Visual Basic)
    http://msdn.microsoft.com/de-de/library/8h84wky1.aspx
     "Wenn Sie initializer für einen Member nicht angeben,
      initialisiert Visual Basic diesen Parameter entweder mit 0..."

    somit bekommt 'Alignment.left' den Wert 0  dann centric=1 right=2. 

    Und zweitens basiert Enum nun mal default auf dem 'Integer' Datentyp.

    Freitag, 31. Dezember 2010 00:02

Alle Antworten

  • Hallo Alexander

    gibt es zu deinem untechnischen  "Dies funktioniert nicht"  auch eine ordentliche Compiler-Fehlermeldung?
    Möglich sind etwa Namenskonflikte mit gleichen 'Alignment', oder Geltungsbereiche usw.
    Donnerstag, 30. Dezember 2010 23:13
  • Hallo Thomas,

    es gibt keine Fehlermeldung, da - wie bereits beschrieben - die Variable startAlignment den Wert 1 enthält und nicht Alignment.left.

    Innerhalb der Enumeration Alignment erhält der Wert left den Wert 1. Ich würde aber gerne die Variable startAlignment nicht nach 1,2 oder 3 auswerten, sondern nach Alignment.left u.s.w.

     

    Alexander

    Donnerstag, 30. Dezember 2010 23:33
  • Innerhalb der Enumeration Alignment erhält der Wert left den Wert 1. Ich würde aber gerne die Variable startAlignment nicht nach 1,2 oder 3
    Alexander,
    also erstens beginnt in .NET default ein Enum bei 0  (zero) aufsteigend:
    Enum-Anweisung (Visual Basic)
    http://msdn.microsoft.com/de-de/library/8h84wky1.aspx
     "Wenn Sie initializer für einen Member nicht angeben,
      initialisiert Visual Basic diesen Parameter entweder mit 0..."

    somit bekommt 'Alignment.left' den Wert 0  dann centric=1 right=2. 

    Und zweitens basiert Enum nun mal default auf dem 'Integer' Datentyp.

    Freitag, 31. Dezember 2010 00:02
  • Hallo Alexander,

    ich weis nicht was Du geschrieben hast. Bei mir funktioniert das einwandfrei. Alle Abfragen und die Anweisungen werden korrekt ausgeführt. Am besten kopierst Du diesen Code in ein Console Projekt und probierst es selber. Im zweiten Teil dieses Codes habe ich noch einige Möglichkeiten aufgezeigt wie man enums konvertieren kann. Vielleicht ist das hilfreich.

    Frohes neues Jahr und viele Grüße Ellen

    Module Module1
      Private Enum Alignment
        Left
        centric
        Right
      End Enum
      Sub Main()
    
        Dim startAlignment As Alignment
        'erhält einen Wert:
        startAlignment = Alignment.left
    
        '
        If startAlignment = Alignment.Left Then
          startAlignment = Alignment.centric
        End If ' OK geht
    
        '
        If startAlignment = 1 Then
          startAlignment = Alignment.Right
        End If ' OK geht auch
    
        '
        If startAlignment = Alignment.Left Then
          startAlignment = Alignment.Right
        End If ' OK geht
    
        'Konvertierungen und Operationen mit enum
        For Each al As Alignment In [Enum].GetValues(GetType(Alignment))
          Console.WriteLine("alignment: {0} /binärer Wert: {1} /logischer Vergleich: {2} /text: {3}", _
                   al, _
                   CType(al, Integer), _
                   startAlignment = al, _
                   al.ToString)
        Next
    
        'Umwandlung zurück in ein Enum-Element aus einem String.
        Dim s As String = "Left"
        startAlignment = DirectCast([Enum].Parse(GetType(Alignment), s), Alignment)
        Console.WriteLine("string: {0} /alignment: {1}", s, startAlignment)
        Console.ReadLine()
    
      End Sub
    
    End Module
    

    Ich benutze/ I'm using VB2008 & VB2010
    Samstag, 1. Januar 2011 15:54