## Why is this an issue?

Nullable value types can hold either a value or `Nothing`.

The value stored in the nullable type can be accessed with the `Value` property or by casting it to the underlying type. Still, both operations throw an `InvalidOperationException` when the value is `Nothing`. A nullable type should always be tested before accessing the value to avoid raising exceptions.

## How to fix it

### Code examples

#### Noncompliant code example

    Sub Sample(condition As Boolean)
        Dim nullableValue As Integer? = If(condition, 42, Nothing)
        Console.WriteLine(nullableValue.Value)             ' Noncompliant: InvalidOperationException is raised

        Dim nullableCast As Integer? = If(condition, 42, Nothing)
        Console.WriteLine(CType(nullableCast, Integer))    ' Noncompliant: InvalidOperationException is raised
    End Sub

#### Compliant solution

    Sub Sample(condition As Boolean)
        Dim nullableValue As Integer? = If(condition, 42, Nothing)
        If nullableValue.HasValue Then
            Console.WriteLine(nullableValue.Value)
        End If

        Dim nullableCast As Integer? = If(condition, 42, Nothing)
        If nullableCast.HasValue Then
            Console.WriteLine(CType(nullableCast, Integer))
        End If
    End Sub

## Resources

### Documentation

- Nullable<T>
- CWE - CWE-476 - NULL Pointer Dereference