8

问题:
为什么下面的代码(不是我写的)甚至可以编译?
我的意思是除了 option strict 关闭和 option infer 开启的事实......

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` 实际上是按位与。
4

1 回答 1

8

接受的答案不正确,VB.NET 中的运算符优先级确保使用 And 运算符的逻辑版本,与 AndAlso 相同。由于使用了 Not 运算符,因此左侧和右侧的操作数都是布尔类型。VB.NET 中的优先级是关系 > 非 > 与。在 C# 中是!> 关系 > &。或者换一种说法,在 VB.NET 中不需要括号,就像在 C# 中那样。

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

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

警告 BC42025:通过实例访问共享成员、常量成员、枚举成员或嵌套类型;将不评估限定表达式。

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

于 2013-09-16T14:13:08.377 回答