Flags属性似乎没有作用



请看下面的代码:

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文档

最新更新