Разрешение типа значения компилятора и жестко закодированные целочисленные значения «0»C#

Место общения программистов C#
Ответить
Anonymous
 Разрешение типа значения компилятора и жестко закодированные целочисленные значения «0»

Сообщение Anonymous »

Во-первых, немного предыстории. Прочтите вопрос и принятый ответ, опубликованный здесь, для конкретного сценария моего вопроса. Я не уверен, существуют ли другие подобные случаи, но это единственный случай, о котором мне известно.

Вышеуказанная «причуда» — это то, о чем я знал. в течение длительного времени. До недавнего времени я не понимал всей сути причины.

Документация Microsoft по классу SqlParameter проливает немного больше света на ситуацию.< /p>


Когда вы указываете Object в параметре значения, SqlDbType
выводится из Microsoft Тип .NET Framework Object.

Будьте осторожны при использовании этой перегрузки конструктора SqlParameter
для указания целочисленных значений параметров. Поскольку эта перегрузка принимает
значение типа Object, необходимо преобразовать целочисленное значение в тип Object
, когда значение равно нулю, как следующий пример C# демонстрирует это.

Код: Выделить всё

Parameter = new SqlParameter("@pname", Convert.ToInt32(0));
Если вы
не выполните это преобразование, компилятор предположит, что вы пытаетесь
вызвать SqlParameter ( string, SqlDbType) перегрузка конструктора.



(выделенный шрифт добавлен)

Мой вопрос: почему компилятор предполагает, что когда вы указываете жестко запрограммированный «0» (и только значение «0»), вы пытаетесь указать тип перечисления, а не целочисленный тип? В этом случае предполагается, что вы объявляете значение SqlDbType вместо значения 0.

Это не интуитивно понятно и, что еще хуже, ошибка несовместима. У меня есть старые приложения, которые я написал и которые годами вызывали хранимые процедуры. Я внесу изменение в приложение (часто даже не связанное с моими классами SQL Server), опубликую обновление, и эта проблема внезапно приведет к поломке приложения.

Почему компилятор смущен значением 0, когда объект, содержащий несколько сигнатур метода, содержит две одинаковые сигнатуры, где один параметр является объектом/целым числом, а другой принимает перечисление?

Как я Как уже упоминалось, я никогда не видел в этом проблемы с каким-либо другим конструктором или методом любого другого класса. Это уникально для класса SqlParameter или это ошибка, унаследованная от C#/.Net?

Подробнее здесь: https://stackoverflow.com/questions/142 ... ger-values
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»