Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ReSharper: how to remove "Possible 'System.NullReferenceException'" warning

Here is a piece of code:

IUser user = managerUser.GetUserById(UserId);
if ( user==null ) 
    throw new Exception(...);

Quote quote = new Quote(user.FullName, user.Email);

Everything is fine here. But if I replace "if" line with the following one:

ComponentException<MyUserManagerException>.FailIfTrue(user == null, "Can't find user with Id=" + UserId);

where function implementation is following:

public abstract class ComponentException<T> : ComponentException
        where T : ComponentException, new()
{
    public static void FailIfTrue(bool expression, string message)
    {
        if (expression)
        {
            T t = new T();
            t.SetErrorMessage(message);
            throw t;
        }
    }
    //...
}

Then ReSharper generates me a warning: Possible 'System.NullReferenceException' pointing on 1st usage of 'user' object.

Q1. Why it generates such exception? As far as I see if user==null then exception will be generated and execution will never reach the usage point.

Q2. How to remove that warning? Please note: 1. I don't want to suppress this warning with comments (I will have a lot of similar pieces and don't want to transform my source code in 'commented garbage); 2. I don't want to changes ReSharper settings to change this problem from warning to 'suggestion' of 'hint'.

Thanks.

Any thoughts are welcome!

P.S. I am using resharper 5.1, MVSV 2008, C#

like image 663
Budda Avatar asked Dec 08 '10 23:12

Budda


People also ask

What does system NullReferenceException mean?

A NullReferenceException exception is thrown when you try to access a member on a type whose value is null . A NullReferenceException exception typically reflects developer error and is thrown in the following scenarios: You've forgotten to instantiate a reference type.

Can NullReferenceException be caught?

Find out which exception you're receiving, and either catch that specific exception, or else prevent it from occurring in the first place. You should never catch NullReferenceException.


2 Answers

Resharper only looks at the current method for its analysis, and does not recursively analyse other methods you call.

You can however direct Resharper a bit and give it meta-information about certain methods. It knows for example about "Assert.IsNotNull(a)", and will take that information into account for the analysis. It is possible to make an external annotations file for Resharper and give it extra information about a certain library to make its analysis better. Maybe this might offer a way to solve your problem.

More information can be found here.

An example showing how it's used for the library Microsoft.Contracts can be found here.

like image 123
rvdginste Avatar answered Oct 13 '22 10:10

rvdginste


A new answer in old post...

Here a little sample of my code regarding how to use CodeContract via ContractAnnotation with Resharper:

    [ContractAnnotation("value:null=>true")]
    public static bool IsNullOrEmpty(this string value)
    {
        return string.IsNullOrEmpty(value);
    }

It is very simple...if u find the breadcrumb in the wood. You can check other cases too.

Have a nice day

like image 25
user3464936 Avatar answered Oct 13 '22 09:10

user3464936