Выбор перегрузки компилятора конструктора SqlParameter
При создании SqlParameter
(.NET3.5) или OdbcParameter
Я часто использую SqlParameter(string parameterName, Object value)
перегрузка конструктора для установки значения в одном операторе.
Однако, когда я попытался передать литерал 0 в качестве параметра значения, я был изначально пойман компилятором C#, выбрав (string, OdbcType)
перегрузка вместо (string, Object)
,
MSDN фактически предупреждает об этой ошибке в разделе замечаний, но объяснение меня смущает.
Почему компилятор C# решает, что литеральный параметр 0 должен быть преобразован в OdbcType
скорее, чем Object
? Предупреждение также говорит, чтобы использовать Convert.ToInt32(0)
заставить Object
перегрузка для использования.
Это сбивает с толку говорит, что это преобразует 0 в "тип объекта". Но разве 0 уже не является "Типом объекта"? В разделе " Типы литеральных значений " на этой странице написано, что литералы всегда типизированы и поэтому наследуются от System.Object
,
Такое поведение не кажется очень интуитивным. Может быть, это как-то связано с Contra-дисперсией или Co-дисперсией?
2 ответа
Согласно спецификации языка C# 4.0:
литерал 0 неявно преобразуется в любой тип перечисления.
Так SqlParameter("parameterName", 0)
решает до SqlParameter(string, OdbcType)
перегрузки.
Если вы измените на SqlParameter("parameterName", 1)
это решает до SqlParameter(string, object)
перегрузки. Та же логика применима к Convert.ToInt32
,
0 - это значение по умолчанию для любого перечисления. Следовательно, это более точное соответствие, чем объект.