常量枚举中的循环定义

时间:2012-10-04 14:09:02

标签: c#

我正在尝试创建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;
}

为什么会这样?

4 个答案:

答案 0 :(得分:15)

因为c#编译器解释了第三个ActivityStatus

public const ActivityStatus ActivityStatus = ActivityStatus.Open; 

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

为避免C#中的循环定义问题,您可以使用全限定名称(如

)引用/调用变量/类型/成员等。
Namespace..Member/Type/ etc

希望您现在可以解决该错误。