1

我有一个枚举,因此:

Enum CurrentPeriodType
   CurrentDate
   Sales
   Utilization
End Enum

我有一个功能:

Private Sub PopulateDDLPeriods(currentPeriodType As CurrentPeriodType)

...

End Sub

我因此进行了函数调用:

PopulateDDLPeriods(False)

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

嗯?

4

2 回答 2

2

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

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

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

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

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

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

于 2012-07-02T16:49:37.800 回答
1

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

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

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

于 2012-07-02T11:53:51.263 回答