代码改变世界

委托返回类型的协变性

2014-08-18 08:43  张小驴同学  阅读(245)  评论(0编辑  收藏  举报
    class Program
    {
        static void Main(string[] args)
        {
            StreamFactory factory = GenerateSampleData;//(3)
            using (Stream stream = factory())//(4)
            {
                int data;
                while ((data=stream.ReadByte())!=-1)
                {
                    Console.WriteLine(data);
                }
            }
            Console.Read();
        }

        private delegate Stream StreamFactory();//(1)

        static MemoryStream GenerateSampleData()//(2)
        {
            byte[] buffer = new byte[16];
            for (int i = 0; i < buffer.Length; i++)
            {
                buffer[i] = (byte)i;
            }
            return new MemoryStream(buffer);
        }
    }

我们声明委托类型的返回类型是Stream(1),但GenerateSampleData方法(2)的返回类型是MemoryStream。负责创建委托实例的那一行(3)执行前面见过的转变换,并利用返回类型的协变性来允许GenerateSampleData座位StreamFactory的操作使用。到调用委托实例的时候(4),编译器已经不知道返回的是一个MemoryStream——如果将stream变量的类型变成MemoryStream,会报告一个编译错误。

 

摘抄自《深入理解C#》第五章,5.3.2 委托返回类型的协变性