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


    以前总是看到泛型类中的泛型类型<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
  • 相关阅读:
    ant
    Java中的值传递和引用传递
    待解决的问题
    Ant生成文件解析
    JUnit初学
    遍历枚举
    2013年5月阅读链接
    《C Primer Plus》阅读笔记(3)
    《C Primer Plus》阅读笔记(2)
    《C Primer Plus》阅读笔记(4)
  • 原文地址:https://www.cnblogs.com/love-zf/p/6419827.html
Copyright © 2020-2023  润新知