记录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#泛型的主要内容,如果未能解决你的问题,请参考以下文章

C#基础知识之泛型

使用泛型类型的 C# lambda 查询

单声道嵌入,从 C 调用 C# 泛型方法

C#泛型

C#规范整理·泛型委托事件

Java泛型 VS C#泛型 (伪泛型 VS 真泛型)