private static ValidationResult CheckCompatibilityOfContractResultWithMethodReturnType(
            CodeContractStatement statement)
        {
            var contractResultTypes =
                statement.CodeContractExpression
                    .Value
                    .With(x => x as ContractEnsures)
                    .Return(ensures => ensures.ContractResultTypes, Enumerable.Empty<IDeclaredType>().ToList());

            var method = statement.GetDeclaredMethod();

            var methodResult = method
                .With(x => x.DeclaredElement)
                .Return(x => x.ReturnType);

            if (methodResult != null && contractResultTypes.Count != 0)
            {
                if (methodResult.IsVoid())
                {
                    return ValidationResult.CreateError(statement.Statement,
                        MalformedContractError.EnsuresInVoidReturnMethod,
                        ErrorForIncompatibleEnsuresAndReturnType(methodResult, contractResultTypes.First(), method));
                }

                if (!MethodResultIsCompatibleWith(methodResult, contractResultTypes))
                {
                    return ValidationResult.CreateError(statement.Statement,
                        MalformedContractError.ResultTypeInEnsuresIsIncompatibleWithMethodReturnType,
                        ErrorForIncompatibleEnsuresAndReturnType(methodResult, contractResultTypes.First(), method));
                }
            }

            return ValidationResult.CreateNoError(statement.Statement);
        }