在“!redirectsDictionary.ContainsKey(autoRedirect.Key)”上收到警告
asp.net可能将null赋值给标有“notnull”属性的实体。
只是想知道那是什么意思?
private static readonly Dictionary<string, Redirect> AutoRedirectsDictionary = new Dictionary<string, Redirect>();
foreach (var r in db.SelectItems("fast:/sitecore/content/Redirects Root//*[@@templatename='Auto Redirect']"))
{
GenerateRedirects(Context.Database.GetItem(r.Fields["Root Node"].Value), r["URL Prefix"]);
foreach (var autoRedirect in AutoRedirectsDictionary)
{
if (!string.IsNullOrEmpty(autoRedirect.Key) & !redirectsDictionary.ContainsKey(autoRedirect.Key))
{
//Add to dictionary
redirectsDictionary.Add(autoRedirect.Key, autoRedirect.Value);
}
}
}
public static void GenerateRedirects(Item redirectFolder, string urlPrefix)
{
if (redirectFolder == null)
return;
var childList = redirectFolder.GetChildren();
foreach (Item child in childList)
{
if (Utilities.HasFieldValue(child, FieldToFind))
{
var shortcutUrl = urlPrefix + child.Fields[FieldToFind].Value.ToLower();
if (!string.IsNullOrEmpty(shortcutUrl) && !AutoRedirectsDictionary.ContainsKey(shortcutUrl))
{
AutoRedirectsDictionary.Add(shortcutUrl,
new Redirect(String.Empty, child, true));
}
}
else
{
GenerateRedirects(child, urlPrefix);
}
}
}
答案 0 :(得分:3)
这可能与您使用单个&
运算符有关。单个&
不会使用短路来绕过语句,而是选择在评估完所有表达式后执行的路径。因此,即使您在ContainsKey调用之前检查!string.IsNullOrEmpty(autoRedirect.Key)
,也将首先评估两个表达式,然后确定执行路径。
编辑,因为我意识到我没有真正回答你的具体问题(你可能已经知道了)但是如果键为空,!redirectsDictionary.ContainsKey(autoRedirect.Key)
将抛出异常。由于密钥的数据类型是string
,如果它是null,它有可能抛出异常,因此警告。