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 委托返回類型的協變性