Ковариантность

Олег Конкин разместил пост 19 февраля 2017

Почему при ковариантности в обобщениях, применительно к интерфейсам, запрещено использовать метод доступа set?

пр. нельзя сделать так:

public interface IContainer<out T>

    {

        T Figure1 { get; }

        T Figure2 { set; }

 

    }

...

Vsevolod разместил пост 23 февраля 2017

Потому что нельзя неявно присвоить в переменную производного типа значение базового.

using System;

 

namespace ConsoleApplication3

{

    public interface IContainer<out T>

    {

        T Figure1 { get; }

 

        //T Figure2 { set; }

    }

 

    class MyClass<T> : IContainer<T> where T : new()

    {

        private T field1 = new T();

        public T Figure1 { get { return field1; } }

 

 

        //private T field2 = new T();

        //public T Figure2 { set { field2 = value; } }

 

    }

 

    class A { }

 

    class B : A { }

 

    class Program

    {

        static void Main(string[] args)

        {

            IContainer<A> obj = new MyClass<B>();

            Console.WriteLine(obj.Figure1);

 

            //--- Figure2 типа B, а после приведения класса к интерфейсу Figure2 может принимать A

            //--- Но при этом физически тип в классе все равно остался В.

            //--- Поэтому и нельзя так делать при ковариантности.

            //obj.Figure2 = new A();

        }

    }

}

 

 

  • Пост понравился
  • Vadim Grechin
Close