Así que tengo un código que pasa alrededor de este objeto anónimo entre los métodos:C# 4: Dinámico y anulables <>
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))
};
Los métodos que reciben este tipo de objeto en el anonimato declaran su tipo que dynamic
:
private static bool IsPromoActive(dynamic promo)
{
return /* check StartDate, EndDate */
}
en tiempo de ejecución, sin embargo, si StartDate
o EndDate
se establecen para new Nullable<DateTime>(DateTime.Parse(...))
, un método que recibe esta dynamic
objeto (llamado promo
) realiza esto:
if (promo.StartDate.HasValue && promo.StartDate > DateTime.Today ||
promo.EndDate.HasValue && promo.EndDate < DateTime.Today)
{
return;
}
lanza una excepción:
Server Error in '/' Application.
'System.DateTime' does not contain a definition for 'HasValue'
lo que está pasando aquí? ¿Qué no entiendo acerca de los tipos Nullable
y la palabra clave dynamic
?
Este código funcionaba bien antes de que cambiara Quité el struct
que previamente almacenada Text
, StartDate
y EndDate
y lo reemplazó con un tipo anónimo y se lo pasó alrededor mientras dynamic
.
Tiene 'promo.StartDate.HasValue', pero al mismo tiempo está usando' promo.StartDate' como si fuera el valor. La incoherencia parece ser un error: use 'promo.StartDate.HasValue' y' promo.StartDate.Value' o promo.StartDate == null' y 'promo.StartDate'. (No sé qué usar, no tengo disponible .NET 4.0 para probar). O ... podría haber un casting implícito, pero no sé si eso es manejado por 'dynamic' muy bien . – strager
No use esa fea sintaxis 'Nullable'; use 'T?' en su lugar :). –
Domenic
Descubrimiento interesante, aunque sin tipos dinámicos, tendría que usar HasValue y Value. Pero como el boxeo de tiempo de ejecución elimina la información que se puede anular y deja solo el valor en caja o nulo, no puede usar estas propiedades. Entonces, no use HasValue en absoluto, compare el objeto con nulo en su lugar. – IllidanS4