【问题标题】:(C#) Enum won't return int(C#) 枚举不会返回 int
【发布时间】:2017-04-14 00:13:25
【问题描述】:

我正在编写一个需要查询多个数据库的应用程序,所以为了标准化我的连接字符串,我编写了以下枚举和方法:

class Program
{
    enum DBEnum { DB1, DB2, DB3, DB4, DB5 }

    static void Main(string[] args)
    {
        using (CacheConnection myConnection = new CacheConnection())
        {
            myConnection.ConnectionTimeout = 9999;
            myConnection.ConnectionString = DBSelect(DBEnum.DB1);
            myConnection.Open();
        }

    }

    public static string DBSelect(int i)
    {
        string connectionString = "";

        switch (i)
        {
            case 0:
                connectionString = *connection string*;
                break;
            case 1:
                connectionString = *connection string*;
                break;
            case 2:
                connectionString = *connection string*;
                break;
            case 3:
                connectionString = *connection string*;
                break;
            case 4:
                connectionString = *connection string*;
                break;
            default:
                break;
        }
        return connectionString;
    }

}

但问题是它没有为枚举定义分配数值。

根据 MSDN,除非枚举被强制转换为不同的数据类型,或者定义是专门定义的,否则定义应该有一个以 0 开头的 int 值。

然而,智能感知对我的抱怨是:

 myConnection.ConnectionString = DBSelect(DBEnum.DB1); 

有无效的参数,如果我说类似

int i = DBEnum.DB1;

它会问我是否缺少演员表。

谢谢!

【问题讨论】:

标签: c# enums casting int enumerator


【解决方案1】:

只需将枚举转换为像

这样的 int
DBSelect((int)DBEnum.DB1);

请参阅上一个关于将枚举转换为整数的问题。 Get int value from enum

编辑:您还应该考虑将连接字符串保存在配置管理器中。请参阅这篇 MSDN 文章了解如何做到这一点

https://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.connectionstrings(v=vs.110).aspx

【讨论】:

  • 或添加方法:public static string DBSelect(DBEnum db) => DBSelect((int)db);
【解决方案2】:

它正在分配一个数值,这不是问题。您正在尝试将其用作 int 而不是枚举。没有从您的枚举到 int 的隐式转换。但是有一个明确的。只需“投射”它

DBSelect((int)DBEnum.DB1);

但更好的是更改方法签名和实现

public static string DBSelect(DBEnume i)
{
    string connectionString = "";

    switch (i)
    {
        case DB1:
            connectionString = *connection string*;
            break;
        case DB2:
            connectionString = *connection string*;
            break;
        case DB3:
            connectionString = *connection string*;
            break;
        case DB4:
            connectionString = *connection string*;
            break;
        case DB5:
            connectionString = *connection string*;
            break;
        default:
            throw new InvalidOperation();
            break;
    }
    return connectionString;
}

然后你应该给枚举案例更好的名字。不限制您仅使用声明的值。基本类型的任何值都可以转换为枚举。所以在你的情况下(DBEnum)10012 是有效的。但是,当您提供信息而不是简单的序列时,枚举的效果非常好

DBEnum {
   UserDb,
   ArticleDb,
   RenderedCacheDb,
}

等等(当然我不知道你的数据库的名称,所以我随机选择了)

【讨论】:

  • 这很有意义。非常感谢。
  • 另外,我有更详细的名称,但只是为了举例,出于安全考虑,我只是将其更改为 DB1。但我确实改变了获取枚举本身的方法,而不是一个 int。非常感谢。
【解决方案3】:

它会询问您是否“缺少演员表”,因为 enums 和 ints 是不同的数据类型。就像其他人说的那样,您需要对其进行类型转换:

DBSelect((int)DBEnum.DB1);

否则,您将不断收到 “无法将enum 显式转换为int32

【讨论】:

    猜你喜欢
    • 2012-11-27
    • 2022-01-12
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多