public static bool TryParse(string value, out ValidEmail email, out IReadOnlyCollection <string> errorMessages)
        {
            var errorMessageList = new List <string>();

            errorMessages = errorMessageList;

            if (IsEmpty(value))
            {
                // TryParse should never fail, so report null as an error instead of ArgumentNullException.
                errorMessageList.Add("Value required");
            }
            else
            {
                value = Email.Normalize(value);

                if (value.Length < MinLength || value.Length > MaxLength)
                {
                    errorMessageList.Add(string.Format("Length must be from {0} to {1} characters", MinLength, MaxLength));
                }

                try
                {
                    if (new MailAddress(value).Address != value.Trim())
                    {
                        errorMessageList.Add("Invalid format");
                    }
                }
                catch
                {
                    errorMessageList.Add("Invalid format");
                }

                if (value.Contains("\""))
                {
                    // Quoted names are valid, but to keep things sane we're not accepting them.
                    errorMessageList.Add("Must not contain quotes");
                }
            }

            if (errorMessageList.Count > 0)
            {
                email = null;
                return(false);
            }

            email = new ValidEmail(value);

            return(true);
        }
        public static bool TryParse(string value, out ValidEmail email)
        {
            IReadOnlyCollection <string> errorMessages;

            return(TryParse(value, out email, out errorMessages));
        }