Why it's impossible to create instance of A in class B using class A protected constructor?
Вы не может вызова защищенного конструктор с помощью модификатора new
потому что цель в защищенного конструктора является то, что он может быть вызван только из производных классов точки зрения, таким образом, не видны из "за пределами".
Компилятор не делает вывод, что вызов new A()
выполняется из экземпляра B
. Вот почему синтаксис конструктора доступен, чтобы гарантировать соглашение о том, как вызвать базовые конструкторы.
Тобой можно назватьA
конструктор при объявлении конструктора для B
:
public B(string foo) : base(foo)
Это то, что на самом деле это делается от Вашего имени конструктора по умолчанию. Например:
public class A {}
public class B : A
{
public B() {}
}
даст следующий IL:
// Methods
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Method begins at RVA 0x205a
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void A::.ctor() <--- This.
IL_0006: ret
} // end of method B::.ctor
Один хака пути (я бы не делать этого), чтобы создать такой экземпляр может быть достигнут с Activator.CreateInstance
перегрузкой, который принимает bool
флага что указывает конструктор является непубличной:
var b = (B)Activator.CreateInstance(typeof(B), nonPublic: true);
для вызова базового конструктора вы можете 'private B(): base()' – Grundy
можете ли вы предоставить сообщение об ошибке _full_? – Grundy
hm, я получаю еще одну ошибку: _Cannot получить доступ к защищенному члену «A.A()» через квалификатор типа «A»; квалификатор должен быть типа «B» (или получен из него) _ – Grundy