Getting a warning on “!redirectsDictionary.ContainsKey(autoRedirect.Key)”
asp.net possible null assignment to entity marked with “notnull” attribute.
Just wondering what that’s about ?
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);
}
}
}
It might have to do with your use of the single
&operator. A single&will not use short-circuiting to bypass a statement but will instead choose the path to execute after all expressions have been evaluated. So even though you’re checking!string.IsNullOrEmpty(autoRedirect.Key)prior to the ContainsKey call, both expressions will be evaluated first and then the path of execution will be decided.Edited as I realized I didn’t truly answer your specific question (and you may already know this) but
!redirectsDictionary.ContainsKey(autoRedirect.Key)will throw an exception if the key is null. Since the datatype for the key is astringthere is a possibility it will throw an exception if it is null, hence the warning.