private ProgramState ProcessCastAccess(ProgramState programState, CastExpressionSyntax castExpression)
            {
                var typeExpression = semanticModel.GetTypeInfo(castExpression.Expression).Type;

                if (typeExpression == null ||
                    !typeExpression.OriginalDefinition.Is(KnownType.System_Nullable_T))
                {
                    return(programState);
                }

                var type = semanticModel.GetTypeInfo(castExpression.Type).Type;

                if (type == null ||
                    type.OriginalDefinition.Is(KnownType.System_Nullable_T) ||
                    !semanticModel.Compilation.ClassifyConversion(typeExpression, type).IsNullable ||
                    !programState.PeekValue().HasConstraint(ObjectConstraint.Null, programState))
                {
                    return(programState);
                }

                if (!context.Equals(default(SyntaxNodeAnalysisContext)))
                {
                    context.ReportDiagnostic(Diagnostic.Create(rule, castExpression.GetLocation(), MessageDefinite));
                }

                return(null);
            }