记录C#泛型
Posted chenbingquan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录C#泛型相关的知识,希望对你有一定的参考价值。
常见的泛型类型
泛型类 class MyClass<T> { //...... } 泛型接口 interface GenericInterface<T> { void GenericMethod(T t); } 泛型方法 public void MyGenericMethod<T>() { //...... } 泛型数组 public T[] GenericArray; 泛型委托 public delegate TOutput GenericDelagete<TInput, TOutput>(TInput input); 泛型结构 struct MyGenericStruct<T> { }
泛型约束
约束 | 说明 |
T:结构 | 类型参数必须是值类型 |
T:类 | 类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。 |
T:new() | 类型参数必须具有无参数的公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。 |
T:<基类名> | 类型参数必须是指定的基类或派生自指定的基类。 |
T:<接口名称> | 类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。 |
1、基类约束
1 /// <summary> 2 /// 基类约束:约束T必须是People类型或者是People的子类 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 /// <param name="tParameter"></param> 6 public static void Show<T>(T tParameter) where T : People 7 { 8 Console.WriteLine($"{tParameter.Id}_{tParameter.Name}"); 9 Parameter.Hi(); 10 }
注意:
基类约束时,基类不能是密封类,即不能是sealed类。sealed类表示该类不能被继承,在这里用作约束就无任何意义,因为sealed类没有子类。
2、接口约束
/// <summary>
/// 接口约束
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static T Get<T>(T t) where T : ISports
{
t.Pingpang();
return t;
}
3、引用类型约束 class
引用类型约束保证T一定是引用类型的。
1 /// <summary>
2 /// 引用类型约束
3 /// </summary>
4 /// <typeparam name="T"></typeparam>
5 /// <param name="t"></param>
6 /// <returns></returns>
7 public static T Get<T>(T t) where T : class
8 {
9 return t;
10 }
4、值类型约束 struct
值类型约束保证T一定是值类型的。
1 /// <summary>
2 /// 值类型类型约束
3 /// </summary>
4 /// <typeparam name="T"></typeparam>
5 /// <param name="t"></param>
6 /// <returns></returns>
7 public static T Get<T>(T t) where T : struct
8 {
9 return t;
10 }
5、无参数构造函数约束 new()
1 /// <summary>
2 /// new()约束
3 /// </summary>
4 /// <typeparam name="T"></typeparam>
5 /// <param name="t"></param>
6 /// <returns></returns>
7 public static T Get<T>(T t) where T : new()
8 {
9 return t;
10 }
泛型约束也可以同时约束多个,例如:
1 public static void Show<T>(T tParameter)
2 where T : People, ISports, IWork, new()
3 {
4 Console.WriteLine($"{tParameter.Id}_{tParameter.Name}");
5 tParameter.Hi();
6 tParameter.Pingpang();
7 tParameter.Work();
8 }
注意:有多个泛型约束时,new()约束一定是在最后。
转载:https://www.cnblogs.com/dotnet261010/p/9034594.html
转载:https://blog.csdn.net/kebi007/article/details/77800954
以上是关于记录C#泛型的主要内容,如果未能解决你的问题,请参考以下文章