修改Discuz!NT源码出现'List' is an ambiguous reference(即不明确的引用)错误

由于工作上的需要,要对Discuz!NT论坛的代码进行更改和功能扩展,结果修改完代码发布到服务器上出现:'List' is an ambiguous reference between 'Discuz.Common.Generic.List<CustomHotTopic>' and 'System.Collections.Generic.List<CustomHotTopic>'的错误。该错误的中文翻译为:“List”是“Discuz.Common.Generic.List<CustomHotTopic>”和“System.Collections.Generic.List<CustomHotTopic>”之间的不明确的引用

备注: 

  1. Discuz!NT是Discuz!论坛的ASP.NET 版本
  2. CustomHotTopic是自己创建的一个类
     

出现的错误提示信息


Server Error in '/' Application.

Compilation Error

Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately. 

Compiler Error Message: CS0104: 'List' is an ambiguous reference between 'Discuz.Common.Generic.List<Discuz.Web.forumindex.CustomHotTopic>' and 'System.Collections.Generic.List<Discuz.Web.forumindex.CustomHotTopic>'

Source Error:
Line 499: List<CustomHotTopic> customHotTopicList = new List<CustomHotTopic>();

Line 500: foreach (ForumHotItemInfo forumhotiteminfo in forumhotconfiginfo.ForumHotCollection)

Source File: d:/web/dt3.6.0/aspx/1/forumindex.aspx    Line: 499 


造成List对象ambiguous reference不明确引用的原因

后经过错误排查,原因竟然是Discuz!NT代码中重写了List泛型集合,导致List类无法明确引用。

Discuz!NT重写的List集合命名空间为Discuz.Common.Generic.List,而C#原本的List命名空间为System.Collections.Generic.List。但是在项目中往往会不留意的使用System.Collections.Generic.List,特别是在.aspx页面中声明命名空间最容易出现:

<%@ Import Namespace="Discuz.Common.Generic" %>
<%@ Import Namespace="System.Collections.Generic" %>

因为Debug不会检查到页面中的这个错误,即不会检查Import Namespace的引用,只有运行网站程序的时候才会报错,所以如果重复引用了两个List的命名空间,并在.aspx页面中使用List,马上就会报错。

如何解决问题'List' is an ambiguous reference即引用不明确的问题

首先要明确一点,由于在项目中已经有许多地方用到Discuz.Common.Generic.List。所以摒弃Discuz!NT的List是很不方便的,只能在需要使用System.Collections.Generic.List的地方声明完整的命名空间以区别开来。
比如下面这样:

  /// <summary>
  /// 使用C#的List类
  /// </summary>
  System.Collections.Generic.List<int> list = new System.Collections.Generic.List<int>();

这样就和Discuz.Common.Generic.List区分开来,防止引用冲突!

关于被重写的List类

这里顺便发下被Discuz!NT重写的List类的源代码,代码位置在  项目/Discuz.Common/Generic.DiscuzList.cs:

Discuz!NT重写的List类的源代码文件位置

源代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.ObjectModel;
using System.Runtime.Serialization;

namespace Discuz.Common.Generic
{
    /// <summary>
    /// 列表泛型类
    /// </summary>
    /// <typeparam name="T">占位符(下同)</typeparam>
    [Serializable]
    public class List<T> : System.Collections.Generic.List<T>, IDiscuzCollection<T> 
    {

        #region 构造函数
        public List() : base() 
        { }

		public List(IEnumerable<T> collection) : base(collection) 
        { }

        public List(int capacity) : base(capacity) 
        { }
        #endregion

        public List<T> Take(int count)
        {
            return this.GetRange(0, count < 0 ? 0 : count);
        }

        public List<T> FindAll(Predicate<T> match)
        {
            List<T> list = new List<T>();
            list.AddRange(base.FindAll(match));
            return list;
        }
  
        public new List<T> GetRange(int start, int count)
        {
            List<T> list = new List<T>();
            //对传入起始位置和长度进行规则校验
            if (start < this.Count && (start + count) <= this.Count)
            {
                list.AddRange(base.GetRange(start, count));
            }
            return list;
        }

        public object SyncRoot
        {
            get
            {
                return this;
            }
        }

        /// <summary>
        /// 是否为空
        /// </summary>
        public bool IsEmpty
        {
            get
            {
                return this.Count == 0;
            }
        }

        private int _fixedsize = default(int);
        /// <summary>
        /// 固定大小属性
        /// </summary>
        public int FixedSize
        {
            get
            {
                return _fixedsize;
            }
            set
            {
                _fixedsize = value;
            }
        }

        /// <summary>
        /// 是否已满
        /// </summary>
        public bool IsFull
        {
            get
            {
                if ((FixedSize != default(int)) && (this.Count >= FixedSize))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }

        /// <summary>
        /// 版本
        /// </summary>
        public string Version
        {
            get
            {
                return "1.0";
            }
        }

        /// <summary>
        /// 作者
        /// </summary>
        public string Author
        {
            get
            {
                return "Discuz!NT";
            }
        }

        public bool IsReadOnly
        {
            get
            {
                return false;
            }
        }

        /// <summary>
        /// 追加元素
        /// </summary>
        /// <param name="value"></param>
        public new void Add(T value)
        {
            if (!this.IsFull)
            {
                base.Add(value);
            }
        }

        /// <summary>
        /// 接受指定的访问方式(访问者模式)
        /// </summary>
        /// <param name="visitor"></param>
        public void Accept(IDiscuzVisitor<T> visitor)
        {
            if (visitor == null)
            {
                throw new ArgumentNullException("访问器为空");
            }

            System.Collections.Generic.List<T>.Enumerator enumerator = this.GetEnumerator();

            while (enumerator.MoveNext())
            {
                visitor.Visit(enumerator.Current);

                if (visitor.HasDone)
                {
                    return;
                }
            }
        }

        /// <summary>
        /// 比较对象
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public int CompareTo(object obj)
        {
            if (obj == null)
            {
                throw new ArgumentNullException("obj");
            }

            if (obj.GetType() == this.GetType())
            {
                List<T> l = obj as List<T>;

                return this.Count.CompareTo(l.Count);
            }
            else
            {
                return this.GetType().FullName.CompareTo(obj.GetType().FullName);
            }
        }

    }
}

 




原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/98361.html

(0)
上一篇 2021年8月21日
下一篇 2021年8月21日

相关推荐

发表回复

登录后才能评论