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