C#为什么不';是否存在从SqlDbType到DbType的隐式转换?

C#为什么不';是否存在从SqlDbType到DbType的隐式转换?,c#,system.data,C#,System.data,我把它归结为一个简单的例子: using System; using System.Data; class MyProgram { void DoStuff(DbType t) { } public MyProgram() { DoStuff(SqlDbType.Int); } } class Program { public static void Main(string[] args) {

我把它归结为一个简单的例子:

using System;
using System.Data;


class MyProgram
{
    void DoStuff(DbType t)
    {

    }

    public MyProgram()
    {
        DoStuff(SqlDbType.Int);
    }
}

class Program
{
    public static void Main(string[] args)
    {
        MyProgram p = new MyProgram();
    }
}
为什么我要这样称呼它

DoStuff((DbType)SqlDbType.Int);
这仅仅是因为他们只是两个统计员,在幕后有某种东西将他们联系在一起吗

干杯,
Alex

SqlDbType和DbType是两个完全独立的枚举。就编译器所知,它们与
enum颜色
enum dayofweek
一样兼容

您需要执行强制转换来告诉编译器“我知道这些是不同的类型,但我希望您将其中一种视为另一种。”

enum关键字用于声明枚举,这是一种不同类型的,由一组名为枚举器列表的命名常量组成

资料来源:(强调矿山)

请注意,MSDN没有记录SqlDbType或DbType的任何特定基础值,因此即使SqlDbType.BigInt和DbType.BigInt今天具有相同的基础值,也没有记录在案的保证它将保持这种方式,或者在每个.NET实现中都是这样

但是,MSDN提供以下保证

设置命令参数时,SqlDbType和DbType是链接的。因此,设置DbType会将SqlDbType更改为支持的SqlDbType

处理代码的最佳方法是

DoStuff(DbType.Int);

当您执行
DoStuff(SqlDbType.Image)
DoStuff(SqlDbType.Structured)
时,您的程序应该如何运行?这里的另一个问题已标记为已回答,谢谢:如果我只是将DBType用作瞬态,并且源代码是(DBType)SqlDbType.Int,而目标接收到DBType,但随后又返回到SqlDbType,该怎么办?是否保证始终具有相同的值?如果您强制转换(SqlDbType)(DbType)SqlDbType.Int,则无法明确保证您将获得与开始时相同的SqlDbType。实际上,至少对于SqlDbType和DbType通用的值,您可能会这样做,但框架并不能保证这一点。