《随笔二十二》——C#中的 “ where字句、扩展方法和泛型类、泛型委托、泛型接口、协变、逆变”

目录

泛型类的示例

where 字句 (317P)

有哪些类型可以被 where 子句所约束 (318P)

泛型方法 (319P)

扩展方法 (145P)

扩展方法和泛型类 (322P)

泛型结构体 (323P)

泛型委托 (323P)

泛型接口 ( 325P )

在普通类中实现泛型接口 (326P)

泛型接口的实现必须唯一 (327P)


泛型类的示例


c# 可以把以下类型编写为泛型:

  • 类、结构、接口、委托和方法。注意前四个是类型,方法是成员。

下面是一个泛型栈的代码示例:


namespace HelloWorld_Console
{
   class MyStack<T>
    {
        const int MaxStack = 10;
        T[] StackArray;
        int StackPointer = 0;
        public MyStack()
        {
            StackArray = new T[MaxStack];
        }
        public void Push(T x)
        {
            if (!IsStackFull)
                StackArray[StackPointer++] = x;
        }
        public T Pop()
        {
            return (!IsStackEmpty) ? StackArray[--StackPointer] : StackArray[0];
        }
        public void Print()
        {
            for (int i=0;i<StackPointer;++i)
            {
                WriteLine($"输出值为:{StackArray[i]}");
            }
        }

        bool IsStackFull
        {
            get
            {
                return StackPointer >= MaxStack;
            }
        }
        bool IsStackEmpty
        {
            get
            {
                return StackPointer <= 0;
            }
        }
    }
  
    class Program
    {

        static void Main(string[] args)
        {
            MyStack<int> StackInt = new MyStack<int>();
            MyStack<string> StackString = new MyStack<string>();
            var StackDouble = new MyStack<double>(); //使用 var 关键字让编译器自己判断类型
            StackInt.Push(3);
            StackInt.Push(5);
            StackInt.Push(7);
            StackInt.Push(9);
            StackInt.Print();
            ReadKey();
        }
    }
}

 


where 字句 (317P)


 要让泛型变得更有用, 我们需要提供额外的信息让编译器知道类型参数可以接受哪些类型。这些额外的信息叫做约束( constrain ),只有符合约束的类型才能替代给定的类型参数, 来产生构造类型。

  那么约束  使用 where  字句。

  • 每个具有约束的类型参数都有自己的where子句。
  • 如果参数具有多个约束,则它们将在where子句中列出,以逗号分隔。

 where 字句的语法如下:

 where 字句的语法

例如, 如下泛型类有3个类型参数。

  • T1是未绑定的, 对于T2只有 Customer类型 或从Customer继承的类型的类才能用作类型实参,
  • 而对于T3只有实现IComparable接口的类才能用于类型实参。


有哪些类型可以被 where 子句所约束 (318P)


  共有五种类型的约束,如图:

约束类型

 

where子句可以以任何次序列出。然而, where子句中的约束列表中的约束必须有特定的顺序:

  • 最多只能有一个主约束,如果有则必须放在第一位。
  • 可以有任意多的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值