昨天开始学习泛型,一天的时间,看下来,感觉最难让我理解的就是泛型约束。于是今天一个上午都在看例子,看资料。都说泛型约束的理解对泛型的学习很关键,于是发个帖子,阐述一下我的理解,高手指点,有错误,请指教。派生约束(就是基类约束和接口约束)class PhoneList<T> where T : PhoneNumber
{
        public T FindPhoneByNumber(string number)
        {
            if (list != null)
            {
                foreach (T t in list)
                {
                    if (!object.Equals(t, null))
                    {
                        if (t.Number == number)
                        {
                            return t;
                        }
                    }
                    else
                    {
                        return null;
                    }
                }
            }
            return null;
        }
}T的类型应该是继承PhoneNumber或者和PhoneNumber同类型,也就是T的实例化t就是PhoneNumber的派生类或者就是PhoneNumber。t打点之后,能够找到PhoneNumber中的方法和属性,我个人感觉其实这就是继承了PhoneNumber类。接口也同理,如果是接口,那么T的实例化就是实现了接口的类。这样方便很多,能过使用的方法不单单只是object的方法了。同时也限制了参数的类型。构造函数约束
这个我理解的比较浅,类型参数必须具有无参数的公共构造函数。也就是冒号后面的那个类的构造函数的是没有参数的。值类型约束
冒号后面是struct,我觉得这个好理解,应该是T就是值类型。引用类约束
冒号后面是class,应该是T就是引用类型。个人觉得比较难理解的派生约束,我以前没有学过C++,所以理解起来比较难。不知道我这样理解行不行,高手指点啊~~

解决方案 »

  1.   

    where(泛型类型约束)(C# 编程指南)
    在泛型类型定义中,where 子句用于指定对下列类型的约束:这些类型可用作泛型声明中定义的类型参数的实参。可以限制是继承自某个基类,值类型或是引用类型,是否具有无参构造函数(即,是否可以用 new T()构造对象)。.net的托管开发是强类型的语言。c++是弱类型语言。别说不约束了。内存块可以被描述为任何类型,当然你随便乱转是会出错,这既是c/c++的灵活,也是带来隐患的地方。
      

  2.   

    不靠谱的地方已经说了。除了c++你不懂乱掰的一句,和new()的约束没看到。其他的理解是对的。
      

  3.   

    T的类型应该是继承PhoneNumber或者和PhoneNumber同类型 
    正解.