SqlTypes.SqlInt16 — интересный тип. Он выглядит как short?, но на самом деле это структура. У него есть куча перегрузок операторов, которые заставляют его вести себя как число. Обратите внимание, как эта версия работает просто отлично:
Int64 value = (Int64)(short.MaxValue + 1); // okay
В котором используется «обычный» оператор сложения, он никогда не может переполниться, поскольку в CLR на самом деле нет оператора сложения, который работает для short. Ближайший тип, который он поддерживает, — это Int32, который здесь не переполняется.
Но SqlInt16 был написан, чтобы поймать эту ошибку, он имеет перегрузку operator+()
, он был явно написан для генерации этого исключения. Другими словами, он действительно реализует семантику 16-битного сложения и кричит, когда результат не помещается обратно в столбец таблицы dbase 16-битного целочисленного типа. Независимо от того, используете ли вы ключевые слова checked или unchecked в C#. Что хорошо, вы действительно хотите знать об этом, когда работаете с базой данных.
Вам нужно вызвать другой метод SqlInt16, оператор преобразования. Тот, который преобразует SqlInt16 в собственный целочисленный тип. Насмешливая разновидность выглядит так:
Int64 value = (Int64)((short)System.Data.SqlTypes.SqlInt16.MaxValue + 1);
Но, конечно, имеет больше смысла напрямую приводить к Int64, SqlInt16 также имеет оператор преобразования для этого:
Int64 value = (Int64)System.Data.SqlTypes.SqlInt16.MaxValue + 1;
Остерегайтесь сомнительной семантики такого кода. Вы не можете привести столбец dbase. Мой первый фрагмент имеет больше смысла.
person
Hans Passant
schedule
20.02.2014