Resharper: Possible null assignment to entity marked with "NotNull" attribute

I apologize if this question is a bit obsessive but I do like my code not to have any wiggly lines underneath it where resharper is telling me off.

I have a generic list:

var permissions = new List<Permission>();

at some point in the code I need to test the first element:

if (permissions.First().ImportID == this.ImportId)
{
   // do stuff
}

Resharper (rightly) complains that permissions could be null, so I take its advice and add a check in:

if (permissions != null && permissions.First().ImportID == this.ImportId)
{
   // do stuff
}

Now I realise that I need to protect against the list being empty so I add a check for any in there too:

if (permissions != null && permissions.Any() && permissions.First().ImportID == this.ImportId)
{
    // do stuff
}

and life is good, the code works & resharper is quiet. Realising that the null + any() check is going to be used quite often I add an extension method:

public static bool IsEmpty<T>(this IEnumerable<T> source)
{
    if (source == null)
        return true; 
    return !source.Any();
}

The only problem is now when I use this:

if (!permissions.IsEmpty() && permissions.First().ImportID == this.ImportId)

Resharper starts moaning again "Possible null assignment to entity marked with "NotNull" attribute".

So, is there a way to let resharper know that permissions will never be null after IsEmpty() has executed (in the same way it understands what != null does) or is my only option to ignore the message.

Jon Skeet
people
quotationmark

I suspect you can use a R# annotation for this. Something like:

[ContractAnnotation("null => true")]
public static bool IsEmpty<T>(this IEnumerable<T> source)
{
    return source == null || !source.Any();
}

I believe that should give R# enough information to work out that you're not trying to use a null reference if IsEmpty returns false.

people

See more on this question at Stackoverflow