c# - 为什么 C# 允许无效的枚举值

标签 c# compiler-construction enums

我花了一段时间试图理解为什么我的 WPF 应用程序没有正确地数据绑定(bind)到枚举属性,这就是原因。

 static void Main(string[] args)
 {
  MyEnum x = 0;
  Console.WriteLine(x.ToString());
  Console.ReadLine();
 }

 public enum MyEnum
 {
  First = 1,
  Second = 2
 }

本质上,问题是在我绑定(bind)到的类的构造函数中没有为枚举属性设置默认值,因此它默认为零。

有什么方法可以告诉 C# 编译器我希望它只接受有效值(并且默认为最低值)?我不希望我的属性接受无效值,我不想为每个使用枚举的属性编写 setter 代码。

最佳答案

不,不幸的是不是。

C# 枚举只是命名数字,真的 - 根本没有验证。我同意很高兴看到这一点,以及具有行为的枚举(如在 Java 中)。不过,我还没有听到任何迹象表明它很快就会到来:(

请注意,类型的默认值总是由“全零位”表示的值——在类型系统中没有办法绕过它,真的。因此,要么您需要将其设置为合理的默认值,要么即使在验证系统中也必须针对它进行显式测试(例如针对引用类型进行 null 测试)。

需要明确的是,我相信有时候使用“数字名称”类型是有意义的……但我认为一组真正受限的值会更有用。

关于c# - 为什么 C# 允许无效的枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3759518/

相关文章:

c++ - "autoreconf": include/Makefile. 未找到

enums - 如何使用否定枚举常量编写 spring data jpa 查询方法?

c# - 在 C# 中执行繁重的 CPU 操作时并行文件 IO

C# 泛型 - 我可以将此类变成泛型吗?

c# - LINQ to Entities 无法识别 ElementAt 方法

.net - 为 .net 编写编译器 - IL 还是字节码?

c# - Mysql 备份超时过期 - C#

java - 运行已编译的java程序的问题

c++ - 将遗留的 c 枚举包装到 c++11 枚举类

带有普通 TypeScript 的 Angular 6 - 错误 : module has no exported member