我有一个我正在阅读的SharePoint列表。在此列表中,有许多项目没有分配给它们的值,从而引发错误。我正在使用的代码如下:
public class FacilitiesDal : BaseDal
{
public List<FacilitiesEntity> FetchItems(string siteName, string listUrl)
{
try
{
using (var site = new SPSite(siteName))
{
using (var web = site.OpenWeb())
{
PostEvent("Successfully opened: " + web.Url, BaseExceptionEventArgs.ExceptionLevel.Debug);
PostEvent("Attempting to load list: " + listUrl, BaseExceptionEventArgs.ExceptionLevel.Debug);
return (from SPListItem item in web.GetList(listUrl).Items
select LoadItems( item["Assigned To"].ToString() ?? "Unassigned",
item["Site(s)"].ToString(),
item["Job Category"].ToString(),
item["Status"].ToString(),
Convert.ToDateTime(item["Date required?"]),
item.ID.ToString(),
item.ContentType.Name,
item.DisplayName,
item.Name,
"",
item.Url,
item["Created By"].ToString(),
item["Modified By"].ToString(),
Convert.ToDateTime(item["Created"]),
item["Created By"].ToString(),
Convert.ToDateTime(item["Created"]),
item["Created By"].ToString())).ToList();
}
}
}
catch (Exception ex)
{
PostEvent("Error fetching Facility list items", BaseExceptionEventArgs.ExceptionLevel.Error, ex);
throw;
}
}
以下是问题所在:
select LoadItems( item["Assigned To"].ToString() ?? "Unassigned",
如果我将该行更改为不尝试读取已分配的字段,如下所示,则可以正常工作:
select LoadItems( "Unassigned",
我可以从中推断出我在这里使用的null collase运算符来评估分配给字段是否为空是不起作用,因为我期待它,但我不明白为什么。我怎么想考虑这个?
答案 0 :(得分:2)
重新生成问题,
string x = null;
String res = x .ToString() ?? "Unassigned"; // <= Will throw NullReference excep.
Console.WriteLine(res +" "+ x.ToString());
例外原因是不合并运营商(??
)。但ToString()
与null
一起使用。
可以通过以下示例确认
String x=null;
Console.WriteLine(x.ToString()); //<= Will throw NullReference excep.
或者在这里更清楚,
Console.WriteLine(null.ToString()); //<= Operator '.' cannot be applied to operand of type <null>
希望这能解决你的困惑。
此外,您可以通过以下方式解决问题:
String x="test";
Console.WriteLine((x ?? "notset").ToString()); // <= Will out test
String y=null;
Console.WriteLine((y ?? "notset").ToString()); // <= Will out notset
所以你的代码:
select LoadItems( (item["Assigned To"] ?? "Unassigned").ToString() ....