I zwyczaj WebControl
który implementuje .Value
gettera/pobierz przekazujących pustych < dziesiętny >Zrozumienie zerowy operatora koalescencyjny (??)
to jest po stronie klienta filtrowanego tekstowe (podklasa TextBox
pomocą dołączonego JavaScript i niektóre logiki po stronie serwera do ustawiania/uzyskiwania wartości)
Oto getter & setter z tej kontroli:
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);
}
}
}
Problem, który widzę jest, że wyjście z tego rachunku:
decimal Amount = uxAmount.Value ?? 0M;
widzę ilość jest ustawiony na „0”, gdy uxAmount.Value
powraca 10000.
To działało jak się spodziewałem (usprawiedliwienia zmiana obudowy):
decimal? _Amount = uxAmount.Value;
decimal amount = _Amount ?? 0;
widziałem też takiego zachowania (ostatnio) podczas wywoływania funkcji UDF zdefiniowany w kontekście danych linq2sql razem z zerowej operatora koalescencyjnego, to wiedziałem, moje wezwanie UDF zwrócił oczekiwano wartość, ale byłem ge zamiast tego wartość RHS.
Dalsze mylenie mnie, jeśli oceniam uxAmount.Value w zegarku, otrzymuję 10000 z typu Nullable<decimal>
.
Oto niektóre wyrażenia próbowałem:
decimal? _Amount = uxAmount.Value; //10000
decimal amount = _Amount ?? 0; //10000
decimal amount2 = _Amount ?? 0M; //10000
decimal Amount = uxAmount.Value ?? 0M; //0
Potem dodałem tego wyrażenia po dokonaniu wspomnianej 4
decimal amount3 = (uxTaxAmount.Value) ?? 0M;
Teraz
decimal Amount = uxAmount.Value ?? 0M; //10000
decimal amount3 = (uxAmount.Value) ?? 0M; //0
Wydaje się ostatniego połączenia jest zawsze 0, ale wartość uxAmount.Value
(która jest przetwarzana z .Text
jak na powyższy program pobierający/ustawiający przy użyciu TryParse
jest stabilny. Zatrzymałem się w punkcie przerwania i nie ma innych wątków, które mogłyby manipulować tą wartością.
Zwróć uwagę na użycie przyrostka M, aby wymusić stałą dziesiętną, ponieważ była ona liczbą całkowitą i podejrzewałem problem z konwersją typu.
Wszelkie pomysły?
Wartość zarówno LHS, jak i RHS wydaje się być stabilna i znana.
--edit-- kilka screengrabs z VS2010
CurrencyTextBox (podklasa TextBox) – agrath
Jest to dziesiętna zgrubna [dziesiętna?] - zobacz definicję gettera/settera u góry pytania – agrath
Czy jesteś pewien, że debugger poprawnie to pokazuje? Czy próbowałeś przejść przez kolejne linie, aby upewnić się, że masz zaktualizowaną wartość "amount3"? Ponieważ gdy 'XXX' jest dziesiętnym z możliwością odgrodzenia, to' XXX ?? 0M' będzie (nie-nullowalnym) znakiem dziesiętnym, który będzie miał wartość "XXX", jeśli jest to wartość inna niż null, a wartość zero w przeciwnym razie. –