泛型类型参数及约束

快来打我* 2022-05-14 08:39 382阅读 0赞

泛型类型参数及约束

  • 泛型类型参数简介

    在定义泛型类型和泛型方法时,常用到泛型类型参数,泛型类型参数是在实例化泛型时指定类型的占位符。泛型类型参数放在“<>”内。

    泛型类型参数命名建议:

    (1)当泛型类型参数为单个字母时,建议用T表示。

    (1)当泛型类型参数用单词定义时,建议在单词前加T。

    private void PromptName(T t) {}
    private void PromptName(Tuser user){}

  • 泛型类型参数约束

    在定义泛型类时,可以对在实例化泛型类时用于类型参数的类型种类施加限制。如果实例化泛型类时使用某个约束所不允许的类型来实例化类,则会产生编译时错误。

    泛型约束分类:
































约束

说明

T:结构

类型参数必须是值类型。 可以指定除 Nullable 以外的任何值类型。

T:类

类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。

T:new()

类型参数必须具有无参数的公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。

T:<基类名>

类型参数必须是指定的基类或派生自指定的基类。

T:<接口名称>

类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。

T:U

为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。

(1)类型参数约束为结构(struct)。

复制代码

  1. public class ShowObjectType<T> where T : struct
  2. {
  3. public void ShowValue<T>(T t)
  4. {
  5. Console.WriteLine(t.GetType());
  6. }
  7. }
  8. class GenericConstraint
  9. {
  10. static void Main()
  11. {
  12. ShowObjectType<int> showInt = new ShowObjectType<int>();
  13. showInt.ShowValue<int>(5);
  14. showInt.ShowValue(5);//从参数可以推导出类型参数类型,则可以省略类型参数类型
  15. //因为约束为值类型,下面代码不能通过编译
  16. ShowObjectType<string> showString = new ShowObjectType<string>();
  17. showString.ShowValue("5");
  18. Console.Read();
  19. }
  20. }

复制代码

(2)类型参数约束为类(class)。

  1. 在应用 where T : class 约束时,避免对类型参数使用 == != 运算符,因为这些运算符仅测试类型为引用类型,而不测试值相等性。

复制代码

  1. class GenericConstraint
  2. {
  3. static void Main()
  4. {
  5. List<string > list = new List<string>();
  6. AddClass<string>(list, "hello generic");
  7. Console.Read();
  8. }
  9. private static void AddClass<T>(List<T> list, T t) where T : class
  10. {
  11. list.Add(t);
  12. }
  13. }

复制代码

(4)类型参数约束为具体类。

  1. 约束为具体类时,可利用类型参数调用具体类的属性和方法。

复制代码

  1. class GenericConstraint
  2. {
  3. static void Main()
  4. {
  5. Person person = new Person { ID = 1, Name = "David" };
  6. PromptName<Person>(person);
  7. Console.Read();
  8. }
  9. //此约束T为Person对象或者继承Person对象
  10. private static void PromptName<T>(T t) where T : Person
  11. {
  12. //此处可使用Person的Name属性
  13. if (t.Name == "David")
  14. {
  15. Console.WriteLine("Person name is David");
  16. }
  17. string name = t.GetName();
  18. Console.WriteLine("Person name is {0}", name);
  19. }
  20. }
  21. public class Person
  22. {
  23. private int id;
  24. public int ID
  25. {
  26. get { return id; }
  27. set { id = value; }
  28. }
  29. private string name;
  30. public string Name
  31. {
  32. get { return name; }
  33. set { name = value; }
  34. }
  35. public string GetName()
  36. {
  37. return Name;
  38. }
  39. }

复制代码

  1. 5)约束多个参数。
  2. class Base { }
  3. class Test<T, U>
  4. where U : struct
  5. where T : Base, new() { }
  6. 6)未绑定类型参数。
  7. 没有约束的类型参数,称为未绑定的类型参数。
  8. class List<T>{}

发表评论

表情:
评论列表 (有 0 条评论,382人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java约束详解

    在Java编程中,泛型(Generics)是一种强大的工具,它允许我们在编写的类、接口或方法中使用模板数据。同时,泛型还有许多约束条件,以确保类型安全。 1. 泛型的基本用法

    相关 约束

    要T是继承于A where T: A 要T继承于B的 where T: B 在定义泛型类时,可以对客户端代码能够在实例化类时用

    相关 类型参数约束

    [泛型类型参数及约束][Link 1] 泛型类型参数简介     在定义泛型类型和泛型方法时,常用到泛型类型参数,泛型类型参数是在实例化泛型时指定类型的占位符。泛型类