创建SqlParameter
(.NET3.5)或OdbcParameter
时,我经常使用SqlParameter(string parameterName, Object value)
构造函数重载来在一个语句中设置值。
但是,当我尝试将文字0作为值参数传递时,我最初被C#编译器选中(string, OdbcType)
重载而不是(string, Object)
。
为什么C#编译器决定将文字0参数转换为OdbcType
而不是Object
?警告还说使用Convert.ToInt32(0)
强制使用Object
重载。
令人困惑的是,这会将0转换为“对象类型”。但是不是0已经是“对象类型”了吗?此页面的Types of Literal Values部分似乎表示文字始终是键入的,因此从System.Object
继承。
这种行为似乎不太直观。这与Contra-variance或Co-variance有关吗?
答案 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是任何枚举的默认值。因此,它是比对象更精确的匹配。