Joseph Nields
Joseph Nields

Reputation: 5661

Why is FxCop giving me a "DoNotCastUnnecessarily" warning?

I have the following :

Option Strict On
Public NotInheritable Class Root
    Public Overrides Function Equals(obj As Object) As Boolean
        If TypeOf obj Is Root Then
            Dim rt As Root = DirectCast(obj, Root)
            Return rt.container.Equals(Me.container) AndAlso
                rt.question.Equals(Me.question)
        End If
        Return False
    End Function
End Class

And FxCop is giving me this warning:

Warning, Certainty 95, for DoNotCastUnnecessarily
{
    Target       : #Equals(System.Object)  (IntrospectionTargetMember)
    Location     : file:///C:/..../Root.vb<46>  (String)
    Resolution   : "'obj', a parameter, is cast to type 'Root' multiple 
                   times in method 'Root.Equals(Object)'. Cache the result 
                   of the 'as' operator or direct cast in order to eliminate 
                   the redundant castclass instruction."
    Help         : http://msdn2.microsoft.com/library/ms182271(VS.90).aspx  (String)
    Category     : Microsoft.Performance  (String)
    CheckId      : CA1800  (String)
    RuleFile     : Performance Rules  (String)
    Info         : "Avoid duplicate casts where possible, since there is 
                   a cost associated with them."
    Created      : 4/21/2015 8:45:17 PM  (DateTime)
    LastSeen     : 4/21/2015 8:55:16 PM  (DateTime)
    Status       : Active  (MessageStatus)
    Fix Category : NonBreaking  (FixCategories)
}

What am I doing wrong? I check the type, and cast if it is the same.

Upvotes: 1

Views: 165

Answers (2)

recursive
recursive

Reputation: 86064

The language being used seems to be tailored to C#, but it's basically asking you to use TryCast instead of Is

    Dim rt As Root = TryCast(obj, Root)
    If Not (rt Is Nothing) Then
        ' code
    End If

The reason is that this internally performs the equivalent of a TryCast anyway, so effort is duplicated.

Upvotes: 3

quadroid
quadroid

Reputation: 8941

Because you can rewrite your cast to

Dim rt As String = TryCast(obj, Root)
If Not (rt is Nohting) Then

Which is more performant than a combination of is and DirectCast

Upvotes: 6

Related Questions