Понимание оператора объединения с нулевым значением (??)

У меня есть пользовательский 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

Stepping through the code showing the value of amount3

Watch dialog and some more detail about state of variables

9
задан agrath 14 August 2012 в 21:30
поделиться