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

时间:2010-06-11 04:36:30

标签: c# ado.net overloading

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

但是,当我尝试将文字0作为值参数传递时,我最初被C#编译器选中(string, OdbcType)重载而不是(string, Object)

MSDN实际上警告remarks section中的这个问题,但解释让我感到困惑。

为什么C#编译器决定将文字0参数转换为OdbcType而不是Object?警告还说使用Convert.ToInt32(0)强制使用Object重载。

令人困惑的是,这会将0转换为“对象类型”。但是不是0已经是“对象类型”了吗?此页面的Types of Literal Values部分似乎表示文字始终是键入的,因此从System.Object继承。

这种行为似乎不太直观。这与Contra-variance或Co-variance有关吗?

2 个答案:

答案 0 :(得分:2)

根据C# Language Specification 4.0

  

字面值0隐式转换为   任何枚举类型。


因此SqlParameter("parameterName", 0)解析为SqlParameter(string, OdbcType)重载。

如果您更改为SqlParameter("parameterName", 1),则会解析为SqlParameter(string, object)超载。同样的逻辑适用于Convert.ToInt32

答案 1 :(得分:1)

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