ReSharper 2017.2 Help

Code Inspection: The given expression of 'is' operator is always of the provided type

ReSharper detects issues when there is a compatibility check (expr is type) between reference types. Such a check might be redundant if the is statement always evaluates to true. According to the C# documentation, "The is statement is true if expr is non-null and the object that results from evaluating the expression can be converted to type; otherwise, it returns false."

If the result of the expression on the left is always of the specified type, we should check the expression for null to be able to eliminate the cast, because if the expression evaluates to null, the result of is will be false.

ReSharper detects whether the expression (cat) is compatible with the type (Animal), and, if it is always compatible, ReSharper aims to eliminate the cast. To be able to do so, it suggests that you compare the result of the expression (cat) with null. The comparison will ensure that the result of the if statement without cast will be the same as it would be with the cast used.

This warning is similar to the compiler warning CS0183: The given expression is always of the provided ('type') type (which ReSharper also detects), but it deals with reference types, while the compiler warning occurs when there is conversion of value types.

Suboptimal codeAfter the quick-fix
class IsExpressionAlwaysTrueDemo { private class Animal { } private class Cat : Animal { } private Animal Method() { Cat cat = new Cat(); if (!(cat is Animal)) { throw new Exception("cat is not Animal or it is null"); } return cat; } }
class IsExpressionAlwaysTrueDemo { private class Animal { } private class Cat : Animal { } private Animal Method() { Cat cat = new Cat(); if (!(cat != null)) { throw new Exception("cat is not Animal or it is null"); } return cat; } }
Last modified: 11 December 2017

See Also