【问题标题】:can not convert implicitly from string to int无法从字符串隐式转换为 int
【发布时间】:2016-04-20 06:01:51
【问题描述】:

在 C# 中,我使用 Enum 来获取下拉值:

class Enum
{
    public enum Fields
    {       
        AssignedTo = "Assigned To",
        CloseReason = "Close Reason",
        CustomerId = "Customer ID",
        CustomerName = "Customer Name",
        CompanyID = "Company ID",
        CompanyName = "Company Name",
    }
}

当我构建解决方案时。我收到错误消息:无法将类型“string”隐式转换为“int”。

我删除了双引号,但仍然显示相同的错误。我做错了什么?

【问题讨论】:

  • 你从哪里得到的语法?
  • 你不能有字符串值的枚举,使用常量
  • 在 c# 中(与 Java 不同),您可以字符串枚举值。枚举值只能是数字(int16,int32)
  • 这是我的一段代码..

标签: c# enums


【解决方案1】:

在 C# 中,字符串不允许用于枚举类型。

引用自 MSDN https://msdn.microsoft.com/en-us/library/sbbt4032.aspx

允许的枚举类型有 byte、sbyte、short、ushort、int、 uint、long 或 ulong

如果必须进行某种转换(即使用 [DisplayName] 属性)以在下拉列表中使用枚举。

【讨论】:

    【解决方案2】:

    我不确定是不是因为你试图向枚举显示字符串,然后是因为枚举只使用 int 16 和 32,所以我们必须创建一个扩展来让它显示字符串,然后使用 int 值来调用它

    using System.Reflection;
    
      public static class EnumExtensions
    {
    
        public static string DisplayName(this Enum value)
        {
            FieldInfo field = value.GetType().GetField(value.ToString());
    
            EnumDisplayNameAttribute attribute
                    = Attribute.GetCustomAttribute(field, typeof(EnumDisplayNameAttribute))
                        as EnumDisplayNameAttribute;
    
            return attribute == null ? value.ToString() : attribute.DisplayName;
        }
    }
    
    public class EnumDisplayNameAttribute : Attribute
    {
        private string _displayName;
        public string DisplayName
        {
            get { return _displayName; }
            set { _displayName = value; }
        }
    }
    class Enum
      {
             public enum Fields
    {       
        [EnumDisplayName(DisplayName = "Assigned To"
        AssignedTo,
        [EnumDisplayName(DisplayName = "Close Reason"
        CloseReason,
        [EnumDisplayName(DisplayName = "Customer ID"
        CustomerId,
        [EnumDisplayName(DisplayName = "Customer Name"
        CustomerName,
        [EnumDisplayName(DisplayName = "Company ID"
        CompanyID,
        [EnumDisplayName(DisplayName = "Company Name"
        CompanyName ,
    }
    }
    

    just like i did for my group description for listview

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        它给出了这个错误,因为默认情况下枚举期望你为枚举中的字段分配一个整数值。

        public enum Fields
        {       
            AssignedTo = 1,
            CloseReason = 2,
            CustomerId = 3,
            CustomerName = 4,
            CompanyID = 5,
            CompanyName = 6
        }
        

        如果你跳过分配部分,它会默认从整数0开始分配字段。

        【讨论】:

          【解决方案5】:

          我认为您不想使用枚举作为下拉菜单。尝试查看 Dictionary 或 DataTable 或其他一些结构。如果您向我们提供有关您到底想做什么的更多详细信息,也许我们可以提供帮助。

          编辑:这是一个使用List<string>作为ComboBox的数据源的简单示例

          List<string> dsList = new List<string>();
          dsList.Add("Assigned To");
          dsList.Add("Close Reason");
          dsList.Add("Customer ID");
          dsList.Add("Customer Name");
          dsList.Add("Company ID");
          dsList.Add("Company Name");
          
          comboBox1.DataSource = dsList;
          

          此外,您可以根据要向用户显示的选项动态更改列表

          【讨论】:

          • 我确实有 4 个下拉选项.. 例如。如果我使用 public const string AssignedTo 和下拉选项,那么它会显示其他下拉选项的值,这也可能不相关。如果我在枚举中给出这个,它会限制该选项。例如,如果我使用关闭原因,我应该只看到关闭原因的下拉值而不是其他值。我正在尝试这个逻辑。
          • 仍然不确定您到底想做什么,但我在答案中添加了一个示例 - 您可以尝试使用 List 作为控件的数据源。希望它将把你推向正确的方向。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-24
          相关资源
          最近更新 更多