【问题标题】:Passing boolean in for Enum parameter type compiles and runs?为枚举参数类型传递布尔值编译并运行?
【发布时间】:2012-07-02 05:05:40
【问题描述】:

因此我有一个枚举:

Enum CurrentPeriodType
   CurrentDate
   Sales
   Utilization
End Enum

我有一个函数:

Private Sub PopulateDDLPeriods(currentPeriodType As CurrentPeriodType)

...

End Sub

我这样调用函数:

PopulateDDLPeriods(False)

我运行它,它编译并运行,我单步执行代码,实际上它从函数调用进入需要 ENUM 的函数。我想也许我有一个超载......但我实际上单步执行了代码,它进入了 ENUM 参数类型函数......

嗯?

【问题讨论】:

  • 您的Option Strict 设置是什么?
  • AakashM 和 APrough 一起总结了情况。 VB 将尽可能在后台执行隐式数据类型转换 - 除非您在代码开头使用 Option Strict On 指令。 Option Strict On 将禁用隐式数据类型转换。

标签: vb.net function enums boolean


【解决方案1】:

这只是可能的,因为您的Option Strict 已关闭。如果您不喜欢看到的行为,请将其打开。但是,这样做也意味着Option Explicit 会强制您声明所有变量,并且还 指定您的Enum 的数据类型,这就是我们知道您已关闭它的方式。

在您的情况下,CurrentDate 的内部值是0。因此,False 可以转换为 0 也可以转换为枚举,这并不奇怪(考虑到 Option Strict 已关闭)。

更令人惊讶的是,即使您按以下方式更改代码,您的代码也能编译并运行:

Enum CurrentPeriodType
   CurrentDate = 1
   Sales = 2
   Utilization = 3
End Enum

或者,如果您开始传入True(转换为-1)。

如您所见,.NET 枚举只是它们各自基础数据类型的“部分枚举”同义词,只要稍加尝试,您就可以获得此类数据类型的任何值。

【讨论】:

    【解决方案2】:

    首先,为什么要让函数使用 Enum,但为其提供布尔值?

    发生的情况是布尔值被评估为 0,从而为您提供 Sales Enum 值。如果您将函数调用中的参数切换为 True,它实际上会在 Enum 中计算为 -1。

    在这种情况下可能会有所帮助的一件事是显式添加枚举的值(CurrentDate = 0、Sales = 1 等)。当您调用该函数时,请确保您的参数是有效的 Enum,而不是提供不同类型的变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 2013-06-05
      相关资源
      最近更新 更多