/// <summary>
        /// Checks whether two given structural types are equal.
        /// </summary>
        /// <param name="x">The left type.</param>
        /// <param name="y">The right type.</param>
        /// <returns>true if the given types are equal, false otherwise.</returns>
        protected virtual bool EqualsStructural(Type x, Type y)
        {
            if (TypeMap.TryGetValue(x, out Type res))
            {
                return(res.Equals(y));
            }
            else
            {
                TypeMap[x] = y;
            }

            var xMembers = x.GetMembers();
            var yMembers = y.GetMembers();

            if (xMembers.Length != yMembers.Length)
            {
                TypeMap.Remove(x);
                return(false);
            }

            foreach (var xMember in xMembers)
            {
                if (MemberComparer.ResolveMember(y, xMember) == null)
                {
                    TypeMap.Remove(x);
                    return(false);
                }
            }

            return(true);
        }