Сначала немного фона. Прочтите вопрос и принятый ответ размещенный здесь для конкретного сценария для моего вопроса. Я не уверен, существуют ли другие аналогичные случаи, но это единственный случай, о котором я знаю.
Вышеупомянутая "причуда" - это то, о чем я давно знаю. До недавнего времени я не понимал всю полноту дела.
Документация Microsoft в классе SqlParameter
проливает немного больше света на ситуацию.
Когда вы указываете
Object
в параметре значения,SqlDbType
выводится из типа Microsoft.NET Framework объекта.Соблюдайте осторожность при использовании этой перегрузки конструктора
SqlParameter
для указания целочисленных значений параметров. Поскольку эта перегрузка занимает значение типаObject
, вы должны преобразовать интегральное значение вObject
введите , когда значение равно нулю, как демонстрирует следующий пример С#.
Parameter = new SqlParameter("@pname", Convert.ToInt32(0));
Если вы это сделаете не выполнять это преобразование, компилятор предполагает, что вы пытаетесь для вызова перегрузки конструктора SqlParameter (string, SqlDbType).
(добавлено)
Мой вопрос в том, почему компилятор предполагает, что когда вы указываете жестко закодированное "0" (и только значение "0" ), которое вы пытаетесь указать тип перечисления, а не целочисленный тип? В этом случае предполагается, что вы объявляете SqlDbType
значение, а не значение 0.
Это неинтуитивно, и, что еще хуже, ошибка является непоследовательной. У меня есть старые приложения, которые я написал, которые называли хранимые процедуры годами. Я внесу изменения в приложение (часто иногда даже не связанные с моими классами SQL Server), публикую обновление, и эта проблема внезапно сломает приложение.
Почему компилятор запутался в значении 0, когда объект, содержащий несколько сигнатур методов, содержит две одинаковые подписи, где один параметр является объектом/целым числом, а другой принимает перечисление?
Как я уже упоминал, я никогда не видел, чтобы это было проблемой с любым другим конструктором или методом в любом другом классе. Является ли это уникальным для класса SqlParameter
или это ошибка наследования внутри С#/. Net?