C# 中枚举可以为 null

spe*_*o37 6 c# enums http-status-codes

只是想知道是否enum只是想知道C# 中

具体来说,我对HttpStatusCode实施感兴趣enum感兴趣。

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

Ste*_*fan 5

来自MSDN

每个枚举类型都有一个基础类型,它可以是除 char 之外的任何整型。枚举元素的默认基础类型是 int。要声明另一个整型类型(例如 byte)的枚举,请在标识符后使用冒号,后跟类型,如以下示例所示。C#

枚举 Day : 字节 {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

批准的枚举类型为 byte、sbyte、short、ushort、int、uint、long 或 ulong。

由于这些只是值类型,因此枚举本身不能是null.

当然,您可以将其包装在Nullable中,它允许值类型表现为“可为空”,但从技术上讲,Nullable<T>它是一个通用结构类型(不可为空),而不是枚举本身,它只是一个包装器,如定义所示:

public struct Nullable<T> where T : struct
Run Code Online (Sandbox Code Playgroud)

您可能想知道:结构怎么可能是这样null请参阅此答案以获取解释

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

基本上,从来没有null。这是一个编译器技巧,可以保证诸如eg:之类的值HasValue始终可用。


Sve*_*vek 3

HttpStatusCodes 枚举

在你关于 的特定问题中HttpStatusCodes

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

例如,如果我只是在代码中写入状态代码422,是否容易阅读/理解?可能不是一个好主意。如果您使用StatusCode.422UnprocessableEntity.

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

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

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

可空枚举

对于 HttpStatusCodes 在所有情况下(我曾经经历过),您都无法为其分配null值,HttpResponse因为属性类型是整数。

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