基础知识系列☞泛型的类型参数小结
以前总是看到泛型类中的泛型类型<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