【问题标题】:Why are my C# enums not working?为什么我的 C# 枚举不起作用?
【发布时间】:2011-12-23 20:15:47
【问题描述】:

我在 C# 中遇到枚举问题

我这里有一个枚举:

namespace Project.Shared
{
    public enum CostType
    {
        Dollars,
        Percent
    }
}

我有一个对象试图在这里使用枚举:

using Project.Shared;
namespace Project.Shared.FooNamespace
{
    public class Foo
    {
        public int CostType { get; set; }

        public Foo()
        {

            CostType = (int)CostType.Dollars; // <--- error syntax highlighting on 'Dollars'
        }
    }
}

这会导致错误:

“int”不包含“Dollars”的定义,并且找不到接受“int”类型的第一个参数的扩展方法“Dollars”(您是否缺少 using 指令或程序集引用?)

我不明白为什么我不能在那里使用我的枚举。有人可以帮我解释一下吗?

【问题讨论】:

  • 这可能暗示您不应为枚举使用与属性相同的名称。
  • 如果您有枚举并且想要枚举值,为什么要将值存储为 int?
  • @JohnSaunders 据我所知,这种行为通常不被认为是不好的风格。这也是 BCL 中的常见模式。
  • @CodeInChaos:10,000 次错误不会成为正确的。
  • @CodeInChaos:好的,那么您将如何区分名称空间和具有相同名称的类型?

标签: c# casting enums


【解决方案1】:

因为您的班级 Foo 有这个定义 - public int CostType { get; set; } - 它比您的 enum 具有更多的本地范围。

尝试使用其命名空间完全限定它:

CostType = (int)Project.Shared.CostType.Dollars;

【讨论】:

  • 另外,我会使用this.CostType = 来帮助解决CostType 的歧义。
  • @ErikPhilips +1 我和你在一起。很多人似乎鄙视在代码中看到this 限定符...
  • int.parse(CostType.toString("d")) 与 (int)CostType 相比怎么样? ?
【解决方案2】:

正如其他人指出的那样,属性比类型“更接近”,因此当简单名称被解析时,属性总是获胜。

不过,这种情况的一个有趣的问题是,如果您创建了 CostType 类型而不是 int 类型的属性,它会起作用。

这是因为 C# 有一个专门针对这种情况的特殊规则,通常称为“颜色颜色”规则。 (因为这是它最常出现的情况:一个名为 Color 的类型和一个名为 Color 的 Color 类型的属性。)

如果一个简单的名称可能意味着一个类型和一个属性或字段具有该名称,该类型,那么 C# 允许您通过通过属性键入 和 实例成员。这使您可以执行以下操作:

Color = Color.Red;
description = Color.ToString();

第一个和第三个颜色是对属性的引用;第二个是对类型的引用。

【讨论】:

    【解决方案3】:

    您有命名冲突。您将属性命名为 CostType,它与枚举名称相同。这种方式 C# 假设​​ Foo() 方法中的两个 CostType 引用都引用属性而不是枚举。

    你可以试试这个:

    CostType = (int)Project.Shared.CostType.Dollars;
    

    【讨论】:

      【解决方案4】:

      把它改成这个,它应该可以工作

      public enum CostType
      { 
          Dollars,
          Percent 
      } 
      
      public class Foo
      {         
          public int CostTypes { get; set; }
          public Foo()
          { 
              CostTypes = (int)CostType.Dollars;
              // <--- error syntax highlighting on 'Dollars'
          }
      } 
      

      我不会将我的汽车属性命名为与我的枚举 CostType 相同的名称我对此进行了测试,并且我发布的内容确实可以编译和工作

      【讨论】:

      • 将此属性命名为CostTypes 毫无意义。它不是标志枚举,因此只能表示单个CostType。那你为什么用复数呢?
      • 我认为他的问题是有访问问题或编译问题,如果是这种情况,那么他应该有完全合格的命名空间或让它们匹配
      • @DJ KRAZE - Per Yuck 的回答我现在完全限定了这些名称
      • 我明白了.. 但根据您最初的错误,我认为这是一个命名问题.. 我的错误.. 这就是为什么我将我的例子复数了,抱歉
      • +1 因为你的回答确实解决了我的问题...我宁愿没有复数命名。
      【解决方案5】:

      问题是在CostType = (int)CostType.Dollars; 中CostType 的两次出现都引用了变量。并且变量CostType 没有名为Dollars 的属性。包含命名空间以引用类型 Project.Shared.CostType 以显式引用类型,而不是变量。

      【讨论】:

        【解决方案6】:

        我通过重新启动 Visual Studio 解决了我的:“ENUM 不包含 VALUE 的定义”错误。以防万一有人遇到同样的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多