## Why is this an issue?

Calling `GetType` on a `Type` variable will always return the `System.Type` representation, which is equivalent to `typeof(System.Type)`. This also applies to passing a `Type` argument to `IsInstanceOfType` which always returns `false`.

In both cases, the results are entirely predictable and should be avoided.

### Exceptions

Calling `GetType` on `System.Type` is considered compliant to get an instance of `System.RuntimeType`, as demonstrated in the following example:

    typeof(Type).GetType(); // Can be used by convention to get an instance of 'System.RuntimeType'

## How to fix it

Make sure the usage of `GetType` or `IsInstanceOfType` is invoked with the correct variable or argument type.

### Code examples

#### Noncompliant code example

    void ExamineSystemType(string str)
    {
        Type stringType = str.GetType();
        Type runtimeType = stringType.GetType(); // Noncompliant

        if (stringType.IsInstanceOfType(typeof(string))) // Noncompliant; will always return false
        { /* ... */ }
    }

#### Compliant solution

    void ExamineSystemType(string str)
    {
        Type stringType = str.GetType();

        if (stringType.IsInstanceOfType(str)) // Compliant
        { /* ... */ }
    }

## Resources

### Documentation

- "Type" class
- "GetType" Method
- "IsInstanceOfType" Method

### Articles & blog posts

- Difference between "System.Type" and "System.RuntimeType"