gpt4 book ai didi

C#4 : Dynamic and Nullable<>

转载 作者:IT王子 更新时间:2023-10-29 04:06:02 25 4
gpt4 key购买 nike

所以我有一些代码在方法之间传递这个匿名对象:

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))
};

接收此匿名对象类型的方法将其类型声明为 dynamic :

private static bool IsPromoActive(dynamic promo)
{
return /* check StartDate, EndDate */
}

然而,在运行时,如果 StartDateEndDate设置为 new Nullable<DateTime>(DateTime.Parse(...)) ,接收此 dynamic 的方法对象(名为 promo )执行此操作:

if (promo.StartDate.HasValue && promo.StartDate > DateTime.Today ||
promo.EndDate.HasValue && promo.EndDate < DateTime.Today)
{
return;
}

它抛出一个异常:

Server Error in '/' Application.
'System.DateTime' does not contain a definition for 'HasValue'

这是怎么回事?我不明白 Nullable类型和 dynamic关键字?

在我删除 struct 之前,这段代码工作正常以前存储的 Text , StartDate , 和 EndDate并将其替换为匿名类型并将其作为 dynamic 传递.

最佳答案

好问题。您可能不知道的两个事实:

  1. 幕后动态只是对象。也就是说,“动态”变量是一个“对象”变量,它向编译器提示“在使用此变量时生成动态操作”。

  2. 没有盒装可为 null 之类的东西。当你装箱一个int? object 你得到一个空对象引用或一个装箱的int。 int 周围的可为 null 的包装器被丢弃。

现在应该很清楚这里发生了什么。如果 promo 是动态的,则 promo.StartDate 是动态的。这意味着在运行时,它是对象。也就是说,如果是值类型,就装箱。这意味着如果它是可为空的,那么它现在要么是空引用,要么是装箱的不可空值。无论哪种方式,那个东西都没有 HasValue 属性。如果你想知道它的值类型是否是一个可空值类型设置为 null,那么检查 promo.StartDate 是否为 null。

关于C#4 : Dynamic and Nullable<>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3728752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com