If nullable reference types (NRT) are enabled, this inspection reports redundant conditional access operators (?.) for expressions that are guaranteed not to be null due to the nullable context and annotations.
In the example below, GetRnd() is declared with the return type Rnd (without the ? annotation), which means that the return value will never be null in the nullable-aware context. Since rnd gets this return value, it will be also considered as non-nullable, making conditional access operator ?. in rnd?.TrueOrFalse unnecessary. Therefore, JetBrains Rider suggests replacing rnd?.TrueOrFalse with rnd.TrueOrFalse.
Suboptimal code
#nullable enable
classTest{
Test()
{
var rnd =GetRnd();
if(rnd?.TrueOrFalse istrue)
Console.WriteLine("True");
}
RndGetRnd()=>newRnd();
}
publicclassRnd
{
publicbool TrueOrFalse =>
newRandom().Next(2)==0;
}
After the quick-fix
#nullable enable
classTest{
Test()
{
var rnd =GetRnd();
if(rnd.TrueOrFalse istrue)
Console.WriteLine("True");
}
RndGetRnd()=>newRnd();
}
publicclassRnd
{
publicbool TrueOrFalse =>
newRandom().Next(2)==0;
}
tip
You can enable or disable NRT for a project in the project properties (press AltEnter on the project and choose Properties), or by using the #nullable directive in your source code.
NRT improve overall precision of the nullability analysis, but there are cases when NRT contracts can be violated, for example, when values are coming from code without #nullable context. In such cases, you may get false positive warnings for nullability checks . You can choose to ignore nullable API contracts and report a problem only when previous operations with the value in your code guarantee that it can or cannot be null.
You can change this behavior right from the AltEnter menu:
... or using the Nullable reference types' warnings mode option on the Editor | Inspection Settings page of JetBrains Rider settings .
When JetBrains Rider ignores nullable API contracts, nullability analysis relies on the program control flow to report redundant null checks. It will use another inspection for that. For example:
var myString =ApiMethod();if(myString isnull)thrownewApplicationException("the string is null");// warning 'Expression is always true'// 'myString' cannot be null because it's already checked for null in our codeif(myString !=null)
Console.WriteLine(myString);
For more information about NRT and how JetBrains Rider supports them, watch this webinar recording: