可以为空的枚举类型的奇怪行为

Jam*_*mes 5 .net asp.net nullable page-lifecycle global-asax

我正在使用Global.asax通过Application_EndRequest事件在每个请求结束时执行日志记录.但是,我看到HTTPContext.Current.Items集合中存储的某些值的奇怪行为.

下面是可以为空的枚举的调试输出.您可以看到有一个值,但HasValue已解析为False?!

{System.Nullable(Of AreaNameEnum)}
    HasValue: False
    hasValue: False
    Value: {System.InvalidOperationException}
    value: ADMIN {0}
Run Code Online (Sandbox Code Playgroud)

我猜测在请求生命周期中访问HTTPContext.Current已经太晚了 - 但它似乎有时可行,有时却不行.任何人都可以更清楚地了解到底发生了什么?

谢谢

Ant*_*nes 4

Nullable 是一个包含布尔值 h​​asValue 和 T 值的结构,其中 T 是值类型。在本例中是一个枚举。枚举必须有某个值,在本例中默认为 0,但是 public Value 会抛出异常,因为 hasValue 为 false。

您所看到的是 Nullable 的内部原理。当 hasValue 为 false 时,您无法将任何内容读入具有任何值的内部值字段。毕竟,如果 value 可以包含 null,那么在这里使用 Nullable 就没有任何意义了。