Ответ 1
Как указано в документации для этого конструктора:
Когда вы указываете объект в параметре значения, SqlDbType выводится из типа объекта Microsoft.NET Framework.
Соблюдайте осторожность при использовании этой перегрузки конструктора SqlParameter, чтобы указать значения целочисленных параметров. Поскольку эта перегрузка принимает значение типа Object, вы должны преобразовать интегральное значение в Object, когда значение равно нулю, как демонстрирует следующий пример С#.
Parameter = new SqlParameter("@pname", (object)0);
Если вы не выполняете это преобразование, компилятор предполагает, что вы пытаетесь вызвать SqlParameter (строка, SqlDbType) перегрузка конструктора.
Вы просто вызывали другой конструктор, чем вы думали в своем случае.
Причиной этого является то, что С# допускает неявное преобразование из целочисленного литерала 0
в типы перечисления (которые являются только целыми типами внизу), и это неявное преобразование приводит к тому, что конструктор (string, SqlDbType)
будет лучше соответствовать перегрузке чем преобразование бокса, необходимое для преобразования int
в object
для конструктора (string, object)
.
Это никогда не будет проблемой при передаче переменной int
, даже если значение этой переменной равно 0
(потому что это не нулевой литерал) или любое другое выражение, имеющее тип int
, Это также не произойдет, если вы явно указали int
на object
, как показано выше, потому что тогда есть только одна соответствующая перегрузка.