委任戻りタイプのコヒーレンス


    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委託返却タイプの協変性