При создании 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-дисперсией?