Więc mam jakiś kod, który przechodzi wokół tego anonimowego obiektu pomiędzy metodami:C# 4: Dynamiczna i Nullable <>
var promo = new
{
Text = promo.Value,
StartDate = (startDate == null) ?
new Nullable<DateTime>() :
new Nullable<DateTime>(DateTime.Parse(startDate.Value)),
EndDate = (endDate == null) ?
new Nullable<DateTime>() :
new Nullable<DateTime>(DateTime.Parse(endDate.Value))
};
Metody, które otrzymają ten anonimowy typ obiektu zadeklarować jej typ jako dynamic
:
private static bool IsPromoActive(dynamic promo)
{
return /* check StartDate, EndDate */
}
W czasie działania, jednakże, jeśli StartDate
lub EndDate
są ustawione new Nullable<DateTime>(DateTime.Parse(...))
, sposób, który odbiera ten dynamic
obiektu (o nazwie promo
) wykonuje sposób:
if (promo.StartDate.HasValue && promo.StartDate > DateTime.Today ||
promo.EndDate.HasValue && promo.EndDate < DateTime.Today)
{
return;
}
zgłasza wyjątek:
Server Error in '/' Application.
'System.DateTime' does not contain a definition for 'HasValue'
Co tu się dzieje? Czego nie rozumiem w przypadku typów Nullable
i słowa kluczowego dynamic
?
Ten kod pracował dobrze, zanim zmieniłem usunąłem struct
że wcześniej zapisany Text
, StartDate
i EndDate
i zastąpił go typu anonimowego i przekazał go wokół jako dynamic
.
Masz 'promo.StartDate.HasValue', ale w tym samym czasie używasz' promo.StartDate', jakby była tą wartością. Ta niespójność wydaje się być błędem: użyj 'promo.StartDate.HasValue' i' promo.StartDate.Value' lub promo.StartDate == null' i 'promo.StartDate'. (Nie wiem, którego użyć, nie mam dostępnego .NET 4.0 do przetestowania.) Lub ... może być niejawny casting, ale nie wiem, czy to jest obsługiwane "dynamicznie" bardzo dobrze . – strager
Nie używaj tej brzydkiej 'Nullable' składni; zamiast tego użyj 'T?' :). –
Domenic
Interesujące odkrycie, bez typów dynamicznych, wymagałoby użycia HasValue i Value. Ale ponieważ boks w środowisku wykonawczym usuwa informacje nullable i pozostawia tylko wartość pudełkową lub wartość null, nie można używać tych właściwości. Więc nie używaj w ogóle HasValue, porównaj obiekt z wartością null. – IllidanS4