C# 中的枚举可以为空吗

Can an enum be null in C#

只是想知道 enum 在 C# 中是否可以为空?

具体来说,我对 enum 在 C# 中的 HttpStatusCode 实现很感兴趣。

如果我不给 HttpStatusCode 的变量赋值会发生什么 类型?如果我尝试分配一个不符合预期的值,会发生什么?

除非您将变量设为 Nullable<MyEnum>(或 MyEnum?)类型。

在幕后,枚举是整数。当枚举未初始化时,它具有 default(int) 值,即 0

编辑:其他基础类型也是可能的,但默认为 int。无论您使用哪种底层类型,未初始化的枚举将始终是底层类型的默认值。

当您不为枚举分配整数值时,第一个选项将设置为 0,因此是默认值。

public enum MyEnum { Foo, Bar, Baz }

MyEnum myEnum;

if(myEnum == MyEnum.Foo) //true 
if(myEnum == MyEnum.Bar) //false
if(myEnum == MyEnum.Baz) //false

当您为枚举分配整数值,并且没有 0(或未分配)值时,您未初始化的枚举将不匹配任何选项。

public enum MyEnum { Foo = 1, Bar = 2, Baz = 3 }

MyEnum myEnum;

if(myEnum == MyEnum.Foo) //false
if(myEnum == MyEnum.Bar) //false
if(myEnum == MyEnum.Baz) //false

来自MSDN

Every enumeration type has an underlying type, which can be any integral type except char. The default underlying type of enumeration elements is int. To declare an enum of another integral type, such as byte, use a colon after the identifier followed by the type, as shown in the following example. C#

enum Day : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

The approved types for an enum are byte, sbyte, short, ushort, int, uint, long, or ulong.

因为这些只是值类型,所以枚举本身不能是 null

当然你可以将它包装在 Nullable 中,它允许值类型表现 "nullable",但从技术上讲,Nullable<T> 是一个通用结构类型(不可为空)并且不是枚举本身,它只是定义的包装器:

public struct Nullable<T> where T : struct

您可能想知道:结构怎么可能是 nullSee this answer for an explanation:

Nullable<bool> b = new Nullable<bool>();

基本上,它永远不会 null。这是一个编译器技巧,可以保证诸如 HasValue 之类的值始终可用。

HttpStatusCodes 枚举

在你关于 HttpStatusCodes 的特定问题中。

实际发生的是“代码 reader 友好”枚举,例如 StatusCodes.400NotFound 只是 400 整数值的表示。如果愿意,您可以手动使用整数值作为参数,但阅读您代码的其他人可能无法理解 HTTP 状态代码。

For example, if I just wrote in my code the status code422, is it easy to read / understand? Probably not a good idea. Someone reading your code will have a better chance if you use StatusCode.422UnprocessableEntity.

什么是有效的 HTTP 状态代码?
如果您发回 HTTP 响应,您可以指定此处列出的任何整数值... https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

未分配或默认行为?
在不知道您使用的是什么方法或什么服务器的情况下,您的问题是“如果未分配会发生什么”。通常的答案是服务器将默认响应 200(OK)状态代码。

使用非标准响应代码
这实际上取决于您在做什么,但是使用不属于标准的响应代码值(例如 -999)可能会(或可能不会)出错,但您应该避免这种情况,因为它不是受支持的标准。

可空枚举

在所有情况下(我曾经经历过)对于 HttpStatusCodes,您 不能null 值分配给 HttpResponse 作为 属性类型是整数。

请注意,我所说的是特定于将状态代码值分配给 HttpResponse 对象的。您可以阅读有关可空枚举的一般问题的其他答案。