ReSharper Annotations. Can it be null?
Published on
Hi,
ReSharper is doing great job when it comes to semantics of your code and control flow graph analysis. The special edge case I want to talk about is nullness analysis.
Unfortunately sometimes it’s hard to predict whether the method returns null or it doesn’t.
To solve this problem R# provides an option to annotate your code.
Let’s look at this snippet:
public Bar Foo()
{
return Random.NextDouble() < 0.1
? null
: new Bar();
}TheFoo()returnsnullwith a probability of 10%. However ReSharper doesn’t warn us when we forget the null-check.
without annotation
Developer can mark the code with[CanBeNull]attribute in order to give a hint to ReSharper.
with annotation
Unfortunately this trick doesn’t work with asynchronous code.
What if we have a code like this:
[CanBeNull]
public async Task<Bar> FooAsync()
{
await DoAsync();
return Random.NextDouble() < 0.1
? null
: new Bar();
}Despite the fact that we returnnullhere the actual return type isTask<Bar>. Which is not null by the way. So the annotation is wrong as well as the warning given to us by R#.
attribute applied to Task, but no to Bar
I was always missing the ability to express that it’s not theTask<T>which can benull, but theTask<T>.Result.
There was even an issue created back in 2013 and finally in ReSharper 9.2 we have a support of brand new[ItemCanBeNull]and[ItemNotNull]attributes.
ItemCanBeNull in action
Both attributes can be applied toIEnumerable<T>,Lazy<T>andTask<T>
ItemCanBeNull applied to Lazy
Happy annotating!
Links
- How to use JetBrains Annotations to improve ReSharper inspections
- Using Annotations to Refine Code Inspection
- JetBrains.Annotations NuGet package