【问题标题】:Circular definition in a constant enum常量枚举中的循环定义
【发布时间】:2012-10-04 14:09:02
【问题描述】:

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

为什么会这样?

【问题讨论】:

  • 如果这样做会痛,请停止这样做。
  • 非常有趣。请注意,如果您删除const(可能指定static 和/或readonly),它会起作用! C# 语言规范第 7.6.4.1 节适用于大多数情况,但为什么不适用于您的情况?

标签: c#


【解决方案1】:

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

public const ActivityStatus ActivityStatus = ActivityStatus.Open; 

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

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

【讨论】:

  • 而解决方法是将ActivityStatus.Open改为Namespace.ActivityStatus.Open
  • 不,这不是编译器错误 - 问题是第三个 ActivityStatus 可能意味着两件事:枚举的名称或常量的名称,编译器必须选择一个 - 和它选择常量的名称(如果出现@EricLippert,他可以解释为什么编译器会做出这个选择......)
  • @DanielHilgarth 不,这不是解决方案。拥有一个与其类型同名的变量只是自找麻烦。解决办法是改变量名。
  • @Servy,我不确定所有人都同意stackoverflow.com/questions/211567/…
  • @Servy:我不同意。有足够多的样本。没有问题的迹象。
【解决方案2】:

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

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

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

【讨论】:

  • 你可以。这个问题是 const 特有的
  • 这不正确。您可以将变量命名为类,没问题。没有反对意见,因为在 ActivityStatus.Open 上使用命名空间可以解决编译器错误。
  • 嗯,你可以,但你永远不应该,即使在使用变量时有某种方法可以消除变量与类型的歧义。
  • @Servy,我不确定所有人都同意stackoverflow.com/questions/211567/…
  • 我非常不同意这个答案。将变量命名为与它的枚举类型相同是非常常见的,恕我直言,这根本不是一个坏习惯。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    Namespace..Member/Type/ etc
    

    希望您现在就修复错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      相关资源
      最近更新 更多