== Why is this an issue?

Because the ``++is++`` operator performs a cast if the object is not null, using ``++is++`` to check type and then casting the same argument to that type, necessarily performs two casts. The same result can be achieved more efficiently with a single cast using ``++as++``, followed by a null-check.


=== Noncompliant code example

[source,csharp]
----
if (x is Fruit)  // Noncompliant
{
  var f = (Fruit)x; // or x as Fruit
  // ...
}
----


=== Compliant solution

[source,csharp]
----
// C# 6
var f = x as Fruit;
if (f != null)
{
  // ...
}
// C# 7
if (x is Fruit fruit)
{
  // ...
}
----


ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

Primary: Replace this type-check-and-cast sequence with an "as" and a null check.

Secondary: Replace this cast


=== Highlighting

* Primary: on the "is" check
* Secondary: on the following casts


'''
== Comments And Links
(visible only on this page)

=== is related to: S1905

=== on 8 Jul 2015, 15:28:40 Ann Campbell wrote:
\[~tamas.vajk] note that I'm a little concerned the title might be too broad. What do you think?

=== on 9 Jul 2015, 12:18:38 Tamas Vajk wrote:
\[~ann.campbell.2] I think the title is okay. Maybe we could add "useless duplicate casts..."


I found this: \https://msdn.microsoft.com/en-us/library/ms182271.aspx, which also uses the phrase "duplicate casts", so there is no need to modify it.

=== on 9 Jul 2015, 12:35:34 Ann Campbell wrote:
\[~tamas.vajk] I vote against adding "useless" to the title since that, in itself, would be redundant. :-)

endif::env-github,rspecator-view[]
