【问题标题】:Why does this code even compile?为什么这段代码甚至可以编译?
【发布时间】:2013-09-16 13:49:10
【问题描述】:

问题:
为什么下面的代码(不是我写的)甚至可以编译?
我的意思是除了选项 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` 实际上是按位与。

【问题讨论】:

  • 这就是逻辑运算和位运算的区别。 msdn.microsoft.com/en-us/library/wz3k228a.aspx
  • 那为什么If 1 = 1 And "hi" Then ...也能编译?它会给你一个运行时异常,但仍然可以编译。
  • @JefferyKhan:可能是因为Option Strict 关闭了。
  • @SLaks Sweet,我不知道这个选项存在。

标签: .net vb.net


【解决方案1】:

接受的答案不正确,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 枚举成员生成。这当然是一种代码味道。除了不忽略警告之外,您还可以将该警告变成错误。项目+属性,编译选项卡,警告配置部分。将“实例变量访问共享成员”设置从警告更改为错误。

【讨论】:

  • 经典。我认为它应该做 A。哦不,实际上是 B。哦等等,它确实是 C。又错了,它最终做的是 B ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
相关资源
最近更新 更多