/// <summary>
        /// 确定指定的两个对象包含的值是否递归相等。
        /// </summary>
        /// <remarks>基于反射调用,可能存在性能问题。</remarks>
        /// <param name="value">要进行值相等比较的第一个对象。</param>
        /// <param name="other">要进行值相等比较的第二个对象。</param>
        /// <returns>若 <paramref name="value"/> 与 <paramref name="other"/> 包含的值递归相等,
        /// 则为 <see langword="true"/>;否则为 <see langword="false"/>。</returns>
        /// <exception cref="MemberAccessException">调用方没有权限来访问对象的成员。</exception>
        public static bool RecursiveEquals(object?value, object?other)
        {
            var comparer = PairReferenceEqualityComparer.Default;
            var compared = new HashSet <ObjectPair>(comparer);

            return(ObjectRuntimeValue.RecursiveEquals(value, other, compared));
        }
 /// <summary>
 /// 确定当前对象与指定对象的值是否相等。
 /// </summary>
 /// <remarks>基于反射调用,可能存在性能问题。
 /// 将递归比较至对象的字段(数组的元素)为 .NET 基元类型 (<see cref="Type.IsPrimitive"/>)、
 /// 字符串 <see cref="string"/> 或指针类型 (<see cref="Type.IsPointer"/>)。</remarks>
 /// <typeparam name="T">对象的类型。</typeparam>
 /// <param name="value">要进行值相等比较的对象。</param>
 /// <param name="other">要与当前对象进行比较的对象。</param>
 /// <returns>若 <paramref name="value"/> 与 <paramref name="other"/> 的值相等,
 /// 则为 <see langword="true"/>;否则为 <see langword="false"/>。</returns>
 public static bool ValueEquals <T>(this T?value, T?other) =>
 ObjectRuntimeValue.RecursiveEquals(value, other);