【问题标题】:Enum type in constructor构造函数中的枚举类型
【发布时间】:2015-01-05 23:37:28
【问题描述】:

所以我必须将一个类中的对象初始化到主窗体中,但我必须放入构造函数中的参数来自我在该类中创建的枚举类型。

    private List<Geluidsfragment> fragmenten;
    private enum ThemaSoorten 
    { 
        Muziek, 
        Luisterboeken, 
        Cabaretshows 
    }    

^按照建议,这部分现在在课堂之外。

// Constrcutors

    public BGExperience(ThemaSoorten thema)
    {
        fragmenten = new List<Geluidsfragment>();
        this.thema = thema;
    }    

这些是字段和字段的构造函数。下面是我需要的这个类的对象的初始化。

public GeluidsfragmentForm()
    {
        InitializeComponent();
        BGExperience bgExperience = new BGExperience("Muziek");
    }

所以重载必须是 ThemaSoorten 类型,并且必须在枚举中,但此时它卡住了。

有人知道怎么解决吗?

【问题讨论】:

  • BGExperience bgExperience = new BGExperience(ThemaSoorten.thema1);
  • 你需要将枚举声明为public并且可能在类之外。
  • 不能像这样为枚举值指定字符串值,只能指定数值。为什么不使用public enum ThemaSoorten { Muziek, Luisterboeken, Cabaretshows };
  • 您不能将字符串分配给 enum 值(至少在 C# 4.0 中没有)。 MSDN 声明“已批准的枚举类型为 byte、sbyte、short、ushort、int、uint、long 或 ulong。”

标签: c# constructor enums


【解决方案1】:

您应该首先公开您的enum,然后尝试这个:

BGExperience bgExperience = new BGExperience(BGExperience.ThemaSoorten.Muziek);

如果您不公开您的enum,您将无法在您的班级之外访问它,更不用说创建班级的实例了。

更新

正如 Sriram 在他的 cmets 中已经正确指出的那样,不将 enum 设为嵌套类型将是一种更好的设计方法。你可以在你的类之外声明它,比如:

public enum ThemaSoorten 
{ 
    Muziek, 
    Luisterboeken, 
    Cabaretshows 
}

然后创建一个新的BGExperience 对象,如下所示:

var bgExperience = new BGExperience(ThemaSoorten.Muziek);

重要提示(感谢 Selman22)

您不能以您已经完成的方式声明enum。这甚至无法编译。此外,您在键入此内容时应该收到一条错误消息。无论如何,定义enum 的正确方法如下:

public enum EnumName
{
    Member1,
    Member2,
    Member3
}

EnumName 的位置,您应该输入您的enum 的名称,并在Member1Member2Member3 的位置输入枚举中项目的名称。如果您希望这些项目具有特定的值,您应该这样做:

public enum EnumName
{
    Member1 = 1,
    Member2 = 2,
    Member3 = 3
}

【讨论】:

  • 那仍然无法编译 ;)
  • @SriramSakthivel 是的,枚举是私有的并且超出范围
  • @SriramSakthivel 我想你是这么说的,因为枚举访问修饰符不是公开的。对吗?
  • @Christos 是的,我的评论是在您编辑答案之前发表的。我仍然建议将枚举设为非嵌套类型。
  • 如何编译? thema1 = "Muziek",
【解决方案2】:

或者也许你想将枚举的字符串值提供给构造函数,那么它是如何工作的:

BGExperience bgExperience = new BGExperience((BGExperience.ThemaSoorten)Enum.Parse(typeof(BGExperience.ThemaSoorten), "Muziek"));

确保为此公开枚举。否则,您必须在构造函数中提供字符串并将其解析为构造函数中的枚举值。

【讨论】:

    【解决方案3】:
    BGExperience bgExperience = new BGExperience(ThemaSoorten.thema1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多