The analyzer has detected that members of one object are accessed in two different ways – using operators "?." and ".". When accessing a part of an expression through "?.", it is assumed that the preceding member may be null; therefore, trying to access this member using operator "." will cause a crash.
Consider the following example:
if (A?.X == X || A.X == maxX) ...
The programmer's inattention may result in a situation when the first check will return false and the second check will raise a NullReferenceException if "A" is null. The fixed code should look like this:
if (A?.X == X || A?.X == maxX) ...
And here is another example of this error, taken from a real application:
return node.IsKind(SyntaxKind.IdentifierName) && node?.Parent?.FirstAncestorOrSelf<....>() != null;
In the second part of the condition, it is assumed that "node" may be null: "node?.Parent"; but there is no such check when calling function "IsKind".
This diagnostic is classified as:
You can look at examples of errors detected by the V3042 diagnostic.