17

我正在尝试创建一个类型的常量,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

4 回答 4

17

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

public const ActivityStatus ActivityStatus = ActivityStatus.Open; 

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

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

于 2012-10-04T14:12:56.727 回答
2

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

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

public class CreateActivity
{
    public int Id;
    public const TheNamespace.ActivityStatus ActivityStatus =
        TheNamespace.ActivityStatus.ActivityStatus.Open;
}
于 2012-10-04T14:13:41.650 回答
0

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

如果公开使用:您只能将属性与 getter 一起使用。

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

于 2015-02-27T13:14:47.370 回答
0

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

Namespace..Member/Type/ etc

希望您现在可以修复错误。

于 2018-08-07T12:25:52.363 回答