常量枚举中的循环定义
我正在尝试创建一个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
希望你现在能解决错误。