namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter12.Listing12_42
{
    interface IReadOnlyPair<T>
    {
        T First { get; }
        T Second { get; }
    }

    interface IPair<T>
    {
        T First { get; set; }
        T Second { get; set; }
    }

    public struct Pair<T> : IPair<T>, IReadOnlyPair<T>
    {
        // ...
        #region Wygenerowana namiastka interfejsu
        public T First
        {
            get
            {
                throw new System.NotImplementedException();
            }
            set
            {
                throw new System.NotImplementedException();
            }
        }

        public T Second
        {
            get
            {
                throw new System.NotImplementedException();
            }
            set
            {
                throw new System.NotImplementedException();
            }
        }
        #endregion Wygenerowana namiastka interfejsu
    }

    class Program
    {
        static void Main()
        {
            // BŁĄD: tylko teoretycznie możliwe, jeśli nie
            // dodasz modyfikatora out dla parametru określającego typ.
            //Pair<Contact> contacts =
            //    new Pair<Contact>(
            //        new Contact("Princess Buttercupt"),
            //        new Contact("Inigo Montoya"));
            //IReadOnlyPair<PdaItem> pair = contacts;
            //PdaItem pdaItem1 = pair.First;
            //PdaItem pdaItem2 = pair.Second;
        }
    }
}
