基础知识系列☞泛型的类型参数小结

以前总是看到泛型类中的泛型类型<T1,T2,T3...>
总感觉晕晕的,这次来个记录博客...
如果以后再懵的话,希望回头看到自己这篇博客能给自己一个提醒...

泛型类↓

    #region Test
    /// <summary>
    /// 测试泛型
    /// </summary>
    /// <typeparam name="T">泛型类型T</typeparam>
    public class Test<T> where T : class
    {
        string str = string.Empty;

        /// <summary>
        /// 无参(默认)构造函数
        /// </summary>
        public Test()
        {
            int i = 0;
            i += 9;
            //
        }
        public Test(T t)
        {
            str = t.ToString();
        }



        /// <summary>
        /// 
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public string 泛型类型T但不是泛型方法(T t)
        {
            return str += t.ToString();
        }
        /// <summary>
        /// 使用默认T类型的一个方法;
        /// 会提示:类型参数"T"与外部类型"Test<T>"中的类型参数同名
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <returns></returns>
        public string 一个参数T_T_t<T>(T t)
        {
            str += t.ToString();
            return str;
        }

        public string 一个参数T1_T1_t1<T1>(T1 t1)
        {
            return str;
        }

        public string 一个参数T1_T_t<T1>(T t) //where T1 : class
        {
            return str;
        }
        public string 两个参数T1_TT1_tt1<T1>(T t, T1 t1)
        {

            str += t1.ToString();

            str += t.ToString();
            return str;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="T1"></typeparam>
        /// <param name="t"></param>
        /// <param name="t1"></param>
        /// <returns></returns>
        public string 两个参数TT1_TT1_tt1<T, T1>(T t, T1 t1)
        {
            return str;
        }

        public string 两个参数T1T2_T1T2_t1t2<T1, T2>(T1 t1, T2 t2)
        {
            return str;
        }
    }

    #endregion

实现测试代码↓

            #region Test
            //测试所用到的类型sp
            System.Media.SoundPlayer sp = new System.Media.SoundPlayer();
            string test_str = "";
            Test<string> t_i = new Test<string>(test_str);
            #region 泛型类型T但不是泛型方法(非泛型方法)
            //此时为非泛型方法了;因为它参数只能是String(在new Test<string>(test_str);已经确定了参数类型)
            test_str = t_i.泛型类型T但不是泛型方法("");
            //接收的参数类型是在实例化的时候决定的...
            Test<System.Media.SoundPlayer> t_sound = new Test<System.Media.SoundPlayer>();
            test_str = t_sound.泛型类型T但不是泛型方法(sp);

            #endregion

            #region 一个参数T_T_t(会提示:类型参数"T"与外部类型"Test<T>"中的类型参数同名)(但是也是可以指定T的类型的)

            test_str = t_i.一个参数T_T_t<int>(0);
            test_str = t_i.一个参数T_T_t("0");
            test_str = t_i.一个参数T_T_t(sp);

            #endregion

            #region 一个参数T1_T1_t1(目测功能和上面的那个[一个参数T_T_t]一样一样的...)
            test_str = t_i.一个参数T1_T1_t1<string>("String");
            test_str = t_i.一个参数T1_T1_t1("String");
            test_str = t_i.一个参数T1_T1_t1(0);
            test_str = t_i.一个参数T1_T1_t1(sp);
            #endregion

            #region 一个参数T1_T_t()
            test_str = t_i.一个参数T1_T_t<System.Media.SoundPlayer>("String");
            test_str = t_i.一个参数T1_T_t<string>("0");
            test_str = t_i.一个参数T1_T_t<int>("0");
            //test_str = t_i.一个参数T1_T_t<int>(0);//报错→参数1:无法从"int"转换为"string"
            #endregion


            #region 两个参数T1_TT1_tt1(这个第一个参数已经在实例化的时候[new Test<string>(test_str)]就已经指定为String,即第一个参数就是T的类型)
            test_str = t_i.两个参数T1_TT1_tt1<int>("7", 5);//这里T类型为string,T1类型为int,//可以简化名称:test_str = t_i.两个参数T1_TT1_tt1("7", 5);
            test_str = t_i.两个参数T1_TT1_tt1("7", "5");//这里T类型为string,T1类型为string,怎么判断"5"是什么类型?→类型推断...
            test_str = t_i.两个参数T1_TT1_tt1("7", sp);//这里T类型为string,T1类型为System.Media.SoundPlayer,
                                                   //test_str = t_i.两个参数T1_TT1_tt1(7, 5);//报错→参数1:无法从"int"转换为"string"
            #endregion

            #region 两个参数TT1_TT1_tt1(比上一个[两个参数T1_TT1_tt1]更灵活)

            test_str = t_i.两个参数TT1_TT1_tt1<int, int>(0, 0);
            test_str = t_i.两个参数TT1_TT1_tt1(0, 0);
            test_str = t_i.两个参数TT1_TT1_tt1("String", sp);

            #endregion

            #region 两个参数T1T2_T1T2_t1t2(和上一个[两个参数TT1_TT1_tt1]目测一样的...)
            test_str = t_i.两个参数T1T2_T1T2_t1t2<string, string>("", "");
            test_str = t_i.两个参数T1T2_T1T2_t1t2(0, "");
            #endregion


            //将鼠标放到F1位置,显示:使用默认T类型的一个方法;



            #endregion

 

posted @ 2017-02-20 15:40  zh89233  阅读(413)  评论(0编辑  收藏  举报