Выбор перегрузки компилятора конструктора 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 - это значение по умолчанию для любого перечисления. Следовательно, это более точное соответствие, чем объект.

Другие вопросы по тегам