标志属性似乎没有任何效果

时间:2014-06-18 10:21:53

标签: .net vb.net

请参阅以下代码:

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的值变为:星期二。我希望它是:周一,周二,根据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

然而,&#39;&#39;现在等于'#NONE&#39;? 数字序列中也有任何逻辑,即0,1,2,4,8等,或者我可以使用0,1,2,3,4等。

1 个答案:

答案 0 :(得分:4)

  

我做错了什么?

您为Monday提供了值0,这意味着当您执行按位OR时它无关紧要。

基于Flags的枚举中唯一合理的0的语义值是None

你应该:

<Flags> _
Public Enum Days
    None = 0
    Monday = 1
    Tuesday = 2
    Wednesday = 4
    Thursday = 8
    ...
End Enum

请注意,除了&#34; none&#34;我包括的价值,与你提到的帖子中给出的值相同。价值观很重要!它们实际上是存储的......这些名称对我们人类来说非常有用。

编辑:现在您已更新了代码,您已将操作员从Or更改为And,因此您执行的按位AND为1和2 ...为0.要添加,您需要使用Or

是的,数字序列正好按位,每次加倍:1,2,4,8,16,32等。&#34; none&#34;值0只是&#34;没有位设置&#34;。我建议你仔细阅读FlagsAttribute documentation