请看下面的代码:
Public Class Form1
<Flags> _
Public Enum Days
Monday = 0
Tuesday = 1
Wednesday = 2
End Enum
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim s As String = (Days.Monday Or Days.Tuesday).ToString()
End Sub
End Class
s的值变成:Tuesday。我希望它是:周一,周二根据Thomas Levesque在这里的回答:FlagsAttribute what for?
我做错了什么?
在Jon Skeets回答之后,我尝试了这个:
<Flags> _
Public Enum Days
None = 0
Monday = 1
Tuesday = 2
Wednesday = 4
End Enum
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim s As String = (Days.Monday And Days.Tuesday).ToString()
End Sub
然而,'s'现在等于'NONE'?此外,在数字序列中是否存在任何逻辑,即0,1,2,4,8等,或者我可以使用0,1,2,3,4等。
我做错了什么?
您给Monday
的值为0,这意味着当您执行位或操作时,它是无关的。
在基于Flags
的enum中,0唯一有意义的语义值是None
。
你应该有:
<Flags> _
Public Enum Days
None = 0
Monday = 1
Tuesday = 2
Wednesday = 4
Thursday = 8
...
End Enum
请注意,除了我所包含的"none"值之外,这与您提到的帖子中给出的值相同。价值观很重要!它们实际上是被存储的东西……这些名字只是对我们人类有用。
编辑:现在您已经更新了代码,您已经将操作符从Or
更改为And
,因此您正在执行1和2的位与…等于0。要添加,您需要使用Or
。
是的,数字序列精确地按位排列,每次翻倍:1,2,4,8,16,32等。0的"none"值就是"没有位设置"。我建议你仔细阅读FlagsAttribute
文档