Выбор перегрузки компилятора конструктора SqlParameter - PullRequest
1 голос
/ 11 июня 2010

При создании SqlParameter (.NET3.5) или OdbcParameter я часто использую перегрузку конструктора SqlParameter(string parameterName, Object value) для установки значения в одном операторе.

Однако, когда я пытался передатьЛитерал 0 в качестве параметра значения, я изначально был пойман компилятором C #, выбрав перегрузку (string, OdbcType) вместо (string, Object).

MSDN фактически предупреждает об этой ошибке в разделе замечаний ,но объяснение сбивает меня с толку.

Почему компилятор C # решает, что литеральный параметр 0 должен быть преобразован в OdbcType, а не Object?В предупреждении также говорится, что для использования перегрузки Object необходимо использовать Convert.ToInt32(0).

Смущает, что это преобразует 0 в «тип объекта».Но разве 0 уже не является «Типом объекта»?В разделе Типы литеральных значений на этой странице написано, что литералы всегда типизированы и поэтому наследуются от System.Object.

Такое поведение не кажется интуитивно понятным.Может быть, это как-то связано с Contra-дисперсией или Co-дисперсией?

Ответы [ 2 ]

2 голосов
/ 12 июня 2010

Согласно спецификации языка C # 4.0 :

литерал 0 неявно преобразуется в любой тип перечисления.


Таким образом, SqlParameter("parameterName", 0) разрешается до перегрузки SqlParameter(string, OdbcType).

Если вы измените значение на SqlParameter("parameterName", 1), оно разрешится до перегрузки SqlParameter(string, object). Та же логика применима к Convert.ToInt32.

1 голос
/ 11 июня 2010

0 - это значение по умолчанию для любого перечисления.Следовательно, это более точное соответствие, чем объект.

...