## Why is this an issue?

Recursion is a technique used to define a problem in terms of the problem itself, usually in terms of a simpler version of the problem itself.

For example, the implementation of the generator for the n-th value of the Fibonacci sequence comes naturally from its mathematical definition, when recursion is used:

    Function NthFibonacciNumber(ByVal n As Integer) As Integer
        If n <= 1 Then
            Return 1
        Else
            Return NthFibonacciNumber(n - 1) + NthFibonacciNumber(n - 2)
        End If
    End Function

As opposed to:

    Function NthFibonacciNumber(ByVal n As Integer) As Integer
        Dim previous As Integer = 0
        Dim last As Integer = 1

        For i = 0 To n - 1
            Dim temp = previous
            previous = last
            last = last + temp
        Next

        Return last
    End Function

The use of recursion is acceptable in methods, like the one above, where you can break out of it.

    Function NthFibonacciNumber(ByVal n As Integer) As Integer
        If n <= 1 Then
            Return 1 ' Base case: stop the recursion
        End If
        ' ...
    End Function

It is also acceptable and makes sense in some type definitions:

    Class Box
        Inherits IComparable(Of Box)

        Public Function CompareTo(ByVal other As Box?) As Integer
            ' Compare the two Box instances...
        End Function
    End Class

With types, some invalid recursive definitions are caught by the compiler:

    Class C2(Of T)               ' Error BC31447 C2(Of T) cannot reference itself in Inherits clause
        Inherits C2(Of T)
    End Class

    Class C2(Of T)
        Inherits C2(Of C2(Of T)) ' Error BC31447 C2(Of T) cannot reference itself in Inherits clause
    End Class

In more complex scenarios, however, the code will compile but execution will result in a TypeLoadException if you try to instantiate the class.

    Class C1(Of T)
    End Class

    Class C2(Of T)              ' Noncompliant
        Inherits C1(Of C2(Of C2(Of T)))
    End Class

    Dim c2 = New C2(Of Integer) ' This would result into a TypeLoadException

## Resources

### Documentation

- Recursion
- TypeLoadException

### Articles & blog posts

- Curiously recurring template pattern
- Modern C# Techniques, Part 1: Curiously Recurring Generic Pattern
- Curiouser and curiouser