Почему при ковариантности в обобщениях, применительно к интерфейсам, запрещено использовать метод доступа set?
пр. нельзя сделать так:
public interface IContainer
{
T Figure1 { get; }
T Figure2 { set; }
}
...
Почему при ковариантности в обобщениях, применительно к интерфейсам, запрещено использовать метод доступа set?
пр. нельзя сделать так:
public interface IContainer
{
T Figure1 { get; }
T Figure2 { set; }
}
...
Потому что нельзя неявно присвоить в переменную производного типа значение базового.
using System;
namespace ConsoleApplication3
{
public interface IContainer
{
T Figure1 { get; }
//T Figure2 { set; }
}
class MyClass : IContainer 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 obj = new MyClass();
Console.WriteLine(obj.Figure1);
//--- Figure2 типа B, а после приведения класса к интерфейсу Figure2 может принимать A
//--- Но при этом физически тип в классе все равно остался В.
//--- Поэтому и нельзя так делать при ковариантности.
//obj.Figure2 = new A();
}
}
}