C# SqlParameter构造函数编译器重载选择

C# SqlParameter构造函数编译器重载选择,c#,ado.net,overloading,C#,Ado.net,Overloading,在创建SqlParameter(.NET3.5)或OdbcParameter时,我经常使用SqlParameter(string parameterName,Object value)构造函数重载在一条语句中设置值 但是,当我尝试将文本0作为值参数传递时,C编译器最初发现我选择了(string,OdbcType)重载,而不是(string,Object) MSDN实际上是在警告中提到了这个问题,但是这个解释让我很困惑 为什么C编译器决定将文本0参数转换为OdbcType,而不是对象?警告还表示使

在创建
SqlParameter
(.NET3.5)或
OdbcParameter
时,我经常使用
SqlParameter(string parameterName,Object value)
构造函数重载在一条语句中设置值

但是,当我尝试将文本0作为值参数传递时,C编译器最初发现我选择了
(string,OdbcType)
重载,而不是
(string,Object)

MSDN实际上是在警告中提到了这个问题,但是这个解释让我很困惑

为什么C编译器决定将文本0参数转换为
OdbcType
,而不是
对象
?警告还表示使用
Convert.ToInt32(0)
强制使用
对象
重载

它混淆地说,这将0转换为“对象类型”。但是0不是已经是“对象类型”了吗?本页的这一部分似乎说,文字总是被键入的,因此从
System.Object
继承


这种行为似乎不是很直观。这可能与反方差或协方差有关吗

0是任何枚举的默认值。因此,它是比对象更精确的匹配

根据:

文本0隐式转换为 任何枚举类型


因此
SqlParameter(“parameterName”,0)
解析为
SqlParameter(string,OdbcType)
重载


如果更改为
SqlParameter(“parameterName”,1)
它将解析为
SqlParameter(string,object)
重载。同样的逻辑也适用于
Convert.ToInt32

,因此如果类型检查不够,编译器会使用参数值来匹配重载?我认为参数的类型或其基类型是唯一使用的信息。我知道枚举的默认类型是整数,但不知道这一点。