为什么这段代码甚至可以编译?

时间:2013-09-16 13:49:10

标签: .net vb.net

问题:
为什么下面的代码(不是我写的)甚至编译?
我的意思是除了选项严格是关闭和选项推断是... ...

If Not actdate.DayOfWeek = DayOfWeek.Saturday And Not actdate.DayOfWeek.Sunday Then
...
End If
<德尔> **编辑:**
对于那些不熟悉VB的人来说,它显然与以下相同:
if (!(actdate.DayOfWeek == DayOfWeek.Saturday) & !actdate.DayOfWeek.Sunday) {
...
}
<德尔> 这基本上已经回答了这个问题,因为要记住的是VB-`AND`实际上是一个按位而且。

1 个答案:

答案 0 :(得分:8)

接受的答案不正确,VB.NET中的运算符优先级确保使用And运算符的逻辑版本,与AndAlso相同。由于使用了Not运算符,左侧和右侧操作数都是Boolean类型。 VB.NET中的优先级是关系&gt;不是&gt;和。在C#中它是! &GT;关系&gt; &放;.换句话说,你不需要像在C#中那样在VB.NET中使用括号。

Visual Basic中的Not运算符接受布尔或数值表达式。就像在C#中一样,枚举值可以隐式转换为与Enum的基本类型匹配的整数值类型。在这种情况下整数。数值0将转换为False。由于DayOfWeek.Sunday的基础值为0,因此Not表达式始终生成True。

所以这是可以接受的语法。但是,您会收到此代码的警告,这与您在C#中遇到的错误非常相似:

  

警告BC42025:通过实例访问共享成员,常量成员,枚举成员或嵌套类型;不会评估合格表达。

由actdate.DayOfWeek属性表达式中使用的Sunday枚举成员生成。这肯定是代码味道。如果不忽略警告,您可以将该警告变为错误。项目+属性,编译选项卡,警告配置部分。将“实例变量访问共享成员”设置从“警告”更改为“错误”。