11

C# 枚举类型安全吗?

如果不是,有什么影响?

4

8 回答 8

15

给出一个稍微不同的答案......虽然从铸造的角度来看这些值是类型安全的,但它们在被铸造后仍然未经检查 - 即

enum Foo { A = 1, B = 2, C = 3 }    
static void Main()
{
    Foo foo = (Foo)500; // works fine
    Console.WriteLine(foo); // also fine - shows 500
}

出于这个原因,您应该注意检查这些值 - 例如使用 a defaultin aswitch会引发异常。

您还可以通过以下方式检查(对于非[Flags]值):

bool isValid = Enum.IsDefined(typeof(Foo), foo);

于 2008-10-16T13:21:37.083 回答
11

是的,他们是。

以下来自http://www.csharp-station.com/Tutorials/Lesson17.aspx

枚举是强类型常量。它们本质上是唯一的类型,允许您将符号名称分配给整数值。在 C# 传统中,它们是强类型的,这意味着即使其成员的基础值相同,一种类型的枚举也不能隐式分配给另一种类型的枚举。同样,整数类型和枚举不是隐式可互换的。不同枚举类型和整数类型之间的所有赋值都需要显式转换。

于 2008-10-16T12:50:51.793 回答
2

对于那些建议使用 Enum.IsDefined 进行参数验证的人......不要!Per Brad Abrams(来自Enum Design 的框架设计指南更新):

Enum.IsDefined() 确实存在两个问题。首先,它加载反射和一堆冷类型元数据,使其成为一个看似昂贵的调用。其次,正如注释所暗示的那样,这里存在版本控制问题。

于 2008-10-16T15:26:54.333 回答
0

是的。

C#:枚举类型:

- 命名值的类型安全枚举。

-防止编程错误

-用户可以控制底层类型(默认为int)

- 也可以控制基础价值

于 2008-10-16T12:53:04.583 回答
0

从技术上讲不是,因为您可以将 Enum 表示为其基值(int、long 等)。但是,如果您确保仅通过提供的名称使用枚举,如果您更改枚举值的名称而不更新其引用,您将收到编译时错误。在这方面是的,它是类型安全的。

于 2008-10-16T12:54:17.030 回答
0

我在这里聚会迟到了,但我想抛出一些额外的东西...... Krzysztof Cwalina对.NET Framework 设计指南的更新。除了上面关于检查以确保将有效值传递给您的枚举的出色提示之外,这还提供了有关如何有效使用它们的其他指导和建议,以及一堆陷阱(尤其是涉及的Flags枚举)等。

于 2008-10-16T15:19:59.667 回答
0

是的,他们是强类型安全的,你不能它不会将枚举常量变量隐式转换为整数值你 hv 2 明确地做数据,例如 enum days { sun, mon } int e = (int ) days.sun; 控制台.writeline(e);

于 2009-05-13T02:28:36.303 回答
0

C# 枚举是类型安全的含义

  1. 您不能从基础类型隐式转换为实际枚举
  2. 此外,您不能将一个枚举的值分配给另一个枚举,即使两个枚举的基础类型相同。始终需要显式强制转换。
  3. 枚举使您的代码更具可读性和可维护性。

我遇到了一个关于枚举的优秀视频教程,解释了它们的类型安全性。看看这里那里

于 2012-07-05T16:14:44.420 回答