У меня есть пользовательский WebControl
, который реализует геттер/сеттер .Value
, возвращающий Nullable
Это текстовое поле с фильтрацией на стороне клиента -(, подкласс TextBox
с включенным javascript и некоторой логикой на стороне сервера для установки/получения значения)
Вот геттер и сеттер из этого элемента управления:
public decimal? Value
{
get
{
decimal amount = 0;
if (!decimal.TryParse(this.Text, NumberStyles.Currency, null, out amount))
{
return null;
}
else
{
return amount;
}
}
set
{
if (!value.HasValue)
{
this.Text = "";
}
else
{
this.Text = string.Format("${0:#,##0.00}", value);
}
}
}
Проблема, которую я вижу, заключается в том, что вывод этого оператора:
decimal Amount = uxAmount.Value ?? 0M;
Я вижу, что для суммы установлено значение «0», когда uxAmount.Value
возвращает 10000.
Это сработало, как я и ожидал (извините за изменение корпуса):
decimal? _Amount = uxAmount.Value;
decimal amount = _Amount ?? 0;
Я также видел это поведение (недавно )при вызове функции UDF, определенной в контексте данных Linq2Sql, вместе с оператором объединения null, то есть я знал, что мой вызов UDF возвращает ожидаемое значение, но вместо этого я получал значение RHS..
Меня еще больше сбивает с толку, если я оцениваю uxAmount.Value в часах, я получаю 10000 типа Nullable<decimal>
.
Вот несколько выражений, которые я пробовал:
decimal? _Amount = uxAmount.Value; //10000
decimal amount = _Amount ?? 0; //10000
decimal amount2 = _Amount ?? 0M; //10000
decimal Amount = uxAmount.Value ?? 0M; //0
Затем я добавил это выражение после приведенных выше 4
decimal amount3 = (uxTaxAmount.Value) ?? 0M;
Сейчас
decimal Amount = uxAmount.Value ?? 0M; //10000
decimal amount3 = (uxAmount.Value) ?? 0M; //0
Кажется, что последний вызов всегда равен 0, но значениеuxAmount.Value
(который анализируется из .Text
в соответствии с приведенным выше геттером/сеттером с использованием TryParse
, является стабильным.Я остановился в точке останова, и нет других потоков, которые могли бы манипулировать этим значением.
Обратите внимание на использование суффикса M, чтобы заставить константу быть десятичной, поскольку она была целочисленной, и я подозревал проблему преобразования типа.
Любые идеи?
Значение как левой, так и правой стороны кажется стабильным и известным.
--редактировать --некоторые скриншоты из VS2010