2010-06-11 71 views
1

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

但是,当我尝试传递一个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继承。

这种行为似乎并不直观。这可能与反方差或共方差有关吗?

回答

2

按照C# Language Specification 4.0

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


所以SqlParameter("parameterName", 0)解析为SqlParameter(string, OdbcType)超载。

如果更改为SqlParameter("parameterName", 1)它将解析为SqlParameter(string, object)过载。相同的逻辑适用于Convert.ToInt32

+0

谢谢,非常清楚的解释。 – Ash 2010-06-15 01:06:54

1

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

+1

因此,如果类型检查不够,编译器将使用参数值来匹配重载?我认为参数的类型或其基本类型是唯一使用的信息。我知道枚举的默认类型是一个整数,但没有意识到这一点。 – Ash 2010-06-11 05:02:45

相关问题