代码行如下所示:
ActiveEndDate = item[BuiltInFieldId.ActiveEndDate] != null ?
DateTime.Parse(item[BuiltInFieldId.ActiveEndDate].ToString()) : (DateTime?)null
我如何确保item[BuiltInFieldId.ActiveEndDate]
不null
声明它,否则不要向ActiveEndDate
变量声明任何内容,甚至不null
。
必须在对象初始化期间
这是所请求的周围代码:
var result = new Xannounce
{
MyX = (
from item in items.Cast<SPListItem>()
from ta in (item[FieldId.x] as string ?? "").Replace(";", string.Empty).Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
where audienceIds.Select(x => x.xID).Contains(ta)
select new Xannounce
{
Xid = item.ID,
Xpub = item[BuiltInFieldId.ResponsiblePublisher] as string ?? string.Empty,
XformUrl = item.ParentList.DefaultEditFormUrl,
ActiveEndDate = item[BuiltInFieldId.ActiveEndDate] != null ? DateTime.Parse(item[BuiltInFieldId.ActiveEndDate].ToString()) : (DateTime?)null,
ActiveStartDate = item[BuiltInFieldId.ActiveStartDate] != null ? DateTime.Parse(item[BuiltInFieldId.ActiveStartDate].ToString()) : (DateTime?)null,
XEndDate = item[BuiltInFieldId.EndDate] != null ? DateTime.Parse(item[BuiltInFieldId.EndDate].ToString()) : (DateTime?)null,
XStartDate = item[BuiltInFieldId.StartDate] != null ? DateTime.Parse(item[BuiltInFieldId.StartDate].ToString()) : (DateTime?)null,
XTitle = item[SPBuiltInFieldId.Title].ToString(),
XMessage = item[SPBuiltInFieldId.Body] != null ? item[SPBuiltInFieldId.Body].ToString() : string.Empty,
Xtype = new SPFieldLookupValue(item[BuiltInFieldId.AnnouncementType].ToString()).LookupId,
XAuthor = item[SPBuiltInFieldId.Author].ToString(),
XAudienceNames = AudienceUtility.FindAudiences(item[FieldId.AudienceTargeting].ToString(), SPServiceContext.Current).Select(y => ' ' + y.AudienceName).ToArray()
}),
// Code continues...
任何形式的帮助或提示都很受欢迎
答案 0 :(得分:5)
如何不使用三元运算符?
if(item[BuiltInFieldId.ActiveEndDate] != null){
ActiveEndDate = item[BuiltInFieldId.ActiveEndDate];
}
答案 1 :(得分:3)
您可以将ActiveEndDate
分配给自己,只要没有附加在您的财产上的奇怪副作用,就会产生与无所事事相同的结果。另外,通过读取代码,只调用.ToString()来重新解析它。这似乎是一个坏主意。如果表达式已经是日期时间,请使用它。如果不是,请不要调用.ToString()。假设它是一个DateTime,您现有的代码简化为:
ActiveEndDate = item[BuiltInFieldId.ActiveEndDate] ?? ActiveEndDate;
如果是别的,你可以这样做:
ActiveEndDate = item[BuiltInFieldId.ActiveEndDate] != null ? DateTime.Parse(item[BuiltInFieldId.ActiveEndDate].ToString()) : ActiveEndDate;
您可能会发现有用的最后一点语法是default
关键字:
ActiveEndDate = item[BuiltInFieldId.ActiveEndDate] ?? default(DateTime);
请注意,DateTime表达式(不是DateTime?)的默认值为1/1/1900
。 DateTime?
的默认值为null。
我尚未涉及的另一个问题是DBNull
。如果你的item
变量是某种类型的IDataRecord(SqlDataReader,DataRow等),你可能正在处理DBNull
,这可能会引发纠结我的其他选项。这也可以解释为什么你在这里调用.ToString(),因为.ToString()以比其他选项更健全的方式处理DBNull。如果你在数据库中有一个字符串类型(如varchar),这很好,但是当处理日期和数字等其他类型时,当你实际拥有一个值时,它仍然是倒退的(希望更常见)。
在这种情况下,我建议首先检查一个简单的if () {}
块,如已在另一个答案中发布的那样。如果你正在进行对象初始化(正如对另一个答案的评论所建议的那样),事情开始变得复杂。现在我们有很多逻辑必须全部适合单个表达式,以处理null
,DBNull
和值的情况。如果那是你的情况,我会用这个:
ActiveEndDate = (item[BuiltInFieldId.ActiveEndDate] == DBNull.Value?null:item[BuiltInFieldId.ActiveEndDate]) ?? ActiveEndDate
答案 2 :(得分:0)
将三元组扩展为if语句:
if (item[BuiltInFieldId.ActiveEndDate] != null) {
ActiveEndDate = item[BuiltInFieldId.ActiveEndDate];
}
非常确定ActiveEndDate
无论如何都会默认为DateTime.MinValue(1/1/0001 12:00:00 AM
)。