Сначала немного фона. Прочтите вопрос и принятый ответ размещенный здесь для конкретного сценария для моего вопроса. Я не уверен, существуют ли другие аналогичные случаи, но это единственный случай, о котором я знаю.
Вышеупомянутая "причуда" - это то, о чем я давно знаю. До недавнего времени я не понимал всю полноту дела.
Документация 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?