首页 新闻 会员 周边

大大们,这啥意思啊,关于泛型约束的

0
悬赏园豆:50 [已解决问题] 解决于 2010-08-06 12:30

编译报错:

Error 1 Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly 

这上面的英文说啥呢?

下面是代码片段

    public class SQLDataAccess : DataAccess
    {
        public SQLDataAccess()
        {
            base.virtualRoomDC = new VirtualRoomDataContext();
        }
      // public abstract void Add<T>(T item) where T: class; 实现这个方法
        public  override void Add<T>(T item) where T: class
        {
            if (this.IsValidated<T>(item))
            {
                Table<T> table = base.virtualRoomDC.GetTable<T>();
                bool itemAlreadyExists = table.Contains<T>(item);
                table.InsertOnSubmit(item);
            }
        }

问题补充: Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly 谢谢顾磊 我知道这泛型的意思,但是我编译不过,报了上面的英文 这个是 实现基类 public abstract void Add<T>(T item) where T: class 抽象方法;但override 居然报那个错误
Not Coder Neither Developer的主页 Not Coder Neither Developer | 初学一级 | 园豆:20
提问于:2010-08-06 11:42
< >
分享
最佳答案
0

意思是说, 重写与显式接口实现方法 的约束是有基类继承的,你不能再在子类又指定或者改变这个规则。

也就是说子类不能改变父类的 约束规则。把 public  override void Add<T>(T item) where T: class 改成 public  override void Add<T>(T item) 就OK。

收获园豆:40
HUHU慈悲 | 大侠五级 |园豆:9973 | 2010-08-06 12:23
但父类是抽象类,必须实现 这是父类 using System; using System.Collections.Generic; namespace DomainObjects { public abstract class DataAccess { protected VirtualRoomDataContext virtualRoomDC = null; protected DataAccess() { } public abstract void Add<T>(T item) where T: class; public abstract void AddAndPersistAll<T>(T item) where T: class; public abstract bool DoesUserAlreadyInWaitingList(tblWaitingList wait); public abstract IEnumerable<T> GetAll<T>() where T: class; public abstract T GetById<T>(int id) where T: class; public abstract IEnumerable<tblRoom> GetRoomsByCourseId(int courseId); public abstract IEnumerable<tblRoom> GetRoomsByTutorUserName(string username); public abstract tblSection GetSection(string sectionNo, int courseId); public abstract IEnumerable<tblSection> GetSections(int courseId); public abstract tblUserInfo GetUserInfoByUserName(string username); public abstract IEnumerable<tblWaitingList> GetWaitingQueue(int roomId, DateTime myDateTime); public abstract void MarkStudentSelected(int waitingRoomId); public abstract void MarkStudentUnSelected(int waitingRoomId); public abstract void PersistAll(); public abstract bool RemoveUserFromRoom(int waitingListId); public abstract void RemoveWaitingStudentByWaitingRoomId(int waitingRoomId); } }
Not Coder Neither Developer | 园豆:20 (初学一级) | 2010-08-06 12:28
不过按你方法是编译过了,谢谢
Not Coder Neither Developer | 园豆:20 (初学一级) | 2010-08-06 12:30
其他回答(2)
0

这就是字面上的意思,"泛型约束"

public  override void Add<T>(T item) where T: class

比如调用这个方法时,给add传递泛型,而这个泛型类型必须是class(一个类),这样有个限制就不会在调用的时候误传别的类型的参数,不会导致程序错误。

泛型约束的引入让程序员在操作C#类型时更加的规范和准确,为了提供强编译时检查和减少类型转换.

收获园豆:10
kyo-yo | 园豆:5587 (大侠五级) | 2010-08-06 11:53
0

楼上正解

钧梓昊逑 | 园豆:945 (小虾三级) | 2010-08-06 12:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册