(C#)Enum不会返回int

时间:2016-11-29 20:40:29

标签: c# enums casting int enumerator

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

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,除非将枚举转换为其他数据类型,或者定义是专门定义的,否则定义的int值应为0。

然而,智能感知到了这条线:

 myConnection.ConnectionString = DBSelect(DBEnum.DB1); 

有无效的参数,如果我说

int i = DBEnum.DB1;

它问我是否错过演员。

谢谢!

3 个答案:

答案 0 :(得分:3)

只需将枚举转换为类似

的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

答案 1 :(得分:3)

它正在分配一个数值,这不是问题。您正在尝试将其用作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;
}

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

DBEnum {
   UserDb,
   ArticleDb,
   RenderedCacheDb,
}

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

答案 2 :(得分:0)

它询问您是否“错过了演员表”,因为enumint是不同的数据类型。像其他人说的那样,你需要输入它:

DBSelect((int)DBEnum.DB1);

否则,您将继续获取“无法将enum明确转换为int32