Почему ваши параметры типа объекта в первую очередь? Почему не так:
public int Update(int serial, DateTime? deliveryDate,
double? quantity, short? shiftTime)
(Обратите внимание, что decimal
может быть лучшим выбором, чем double
- о чем подумать.)
Если вы, возможно, сможете изменить сигнатуру вашего метода, возможно, это правильный путь.
В противном случае, что вы действительно спрашиваете в своем вопросе? Если вы не можете изменить параметры, но аргументы должны быть типа DateTime
(или ноль), double
(или ноль) и short
(или ноль), тогда вы можете просто привести их в их обнуляемые эквиваленты. Это распакует null
в нулевое значение типа, а ненулевые значения в соответствующие ненулевые значения:
object x = 10;
int? y = (int?) x; // y = non-null value 10
x = null;
y = (int?) x; // y is null value of the Nullable<int> type
РЕДАКТИРОВАТЬ: Чтобы ответить на комментарий ...
Предположим, у вас есть текстовое поле для времени смены. Есть три варианта: он заполнен, но неуместно (например, "foo"), он пуст или он действителен. Вы бы сделали что-то вроде этого:
short? shiftTime = null;
string userInput = shiftTimeInput.Text;
if (userInput.Length > 0) // User has put *something* in
{
short value;
if (short.TryParse(userInput, out value))
{
shiftTime = value;
}
else
{
// Do whatever you need to in order to handle invalid
// input.
}
}
// Now shiftTime is either null if the user left it blank, or the right value
// Call the Update method passing in shiftTime.