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。負(fù)責(zé)創(chuàng)建委托實(shí)例的那一行(3)執(zhí)行前面見過的轉(zhuǎn)變換,并利用返回類型的協(xié)變性來允許GenerateSampleData座位StreamFactory的操作使用。到調(diào)用委托實(shí)例的時(shí)候(4),編譯器已經(jīng)不知道返回的是一個(gè)MemoryStream——如果將stream變量的類型變成MemoryStream,會(huì)報(bào)告一個(gè)編譯錯(cuò)誤。
摘抄自《深入理解C#》第五章,5.3.2 委托返回類型的協(xié)變性
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注