基础知识系列☞泛型的类型参数小结
以前总是看到泛型类中的泛型类型<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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了