Я портирую некоторый код Java на C #, и я столкнулся с этой идиомой, используемой для копирования объектов:
class Base
{
int x;
public Base(int x) { this.x = x; }
protected Base(Base other) { x = other.x; }
}
class Derived : Base
{
Base foo;
public Derived(Derived other)
: base(other)
{
foo = new Base(other.foo); // Error CS1540
}
}
Ошибка CS1540:
Невозможно получить доступ к защищенному элементу 'Base.Base (Base)' через квалификатор типа «Базовый»; квалификатор должен иметь тип 'Derived' (или производный от него)
Я понимаю цель этой ошибки: она предотвращает доступ к защищенным членам родственных типов. Но Base.Base (Base), очевидно, не будет вызываться для родственного типа! Это просто не включено в спецификацию, или я упустил какую-то причину, по которой это было бы небезопасно?
РЕДАКТИРОВАТЬ: Ага, идиома была новая база (other.foo)
не новая База (другое)