常量枚举中的循环定义

我正在尝试创建一个Enum类型的常量但是我得到一个错误..我的枚举是:

 public enum ActivityStatus { Open = 1, Close = 2 } 

我有一个使用它的模型:

 public class CreateActivity { public int Id; public const ActivityStatus ActivityStatus = ActivityStatus.Open; } 

发生以下错误:

错误1“Help_Desk.Models.CreateActivity.ActivityStatus”常量值的评估涉及循环定义……

但是,如果我更改ActivityStatus属性的名称,它的工作原理!

 public class CreateActivity { public int Id; public const ActivityStatus AnyOtherName = ActivityStatus.Open; } 

为什么会这样?

因为c#编译器在第三个ActivityStatus中填充:

 public const ActivityStatus ActivityStatus = ActivityStatus.Open; 

作为定义的常量的名称而不是枚举的名称 – 因此循环引用:您根据常量本身定义常量。

在C#中,您可以对成员和类型使用相同的名称,并且通常解决指定完全限定名称的歧义(即添加命名空间),但根据我的经验,这不是一个好主意,它会使代码混乱:编译器可以弄清楚这是哪个,但是穷人阅读代码时很难确定某个名称是指某个类别或类型或成员。

您不应该创建具有相同类或枚举名称的变量。

如果指定命名空间,它可能会起作用,例如:

 public class CreateActivity { public int Id; public const TheNamespace.ActivityStatus ActivityStatus = TheNamespace.ActivityStatus.ActivityStatus.Open; } 

如果仅限私人使用:您可以将ActivityStatus更改为只读字段并将默认值的设置移动到构造函数。

如果公开使用:您可以仅使用带有getter的属性。

在大多数代码分析器中,额外的命名空间将被视为代码中的冗余。

为避免C#中的循环定义问题,您可以使用完全限定名称来引用/调用变量/类型/成员等

 Namespace..Member/Type/ etc 

希望你现在能解决错误。