@thekip
Php/C#/Js Developer

Для типа «ИмяТипа» не определен конструктор при переопределении класса?

Не могу разобраться в чем проблема. В C# новичок, и с такой проблемой ранее не сталкивался.

В гугле ответы тоже не в тему.


Вообщем при попытке наследовать некий класс, выдает такое сообщение. Сам класс находится внутри сторонней скомпилированной сборки.

Посмотрел сборку с помощью Reflector'a, видно что у конструктора стоит модификатор видимости internal.

Ключевое слово internal модификатор доступа для типов и членов типов. Внутренние типы или члены доступны только внутри файлов в одной и той же сборке



Вообщем попытался написать свой конструктор в переопределенном классе — проблема осталась.


Можно ли такой класс вообще как либо переопределить(отнаследоваться)?
  • Вопрос задан
  • 4337 просмотров
Пригласить эксперта
Ответы на вопрос 5
pinebit
@pinebit
Freelance Software Engineer
Можно, если в исходной сборке в манифесте добавить атрибут InternalsVisibleTo. Как добавить такой атрибут в откомпилированную сборку — это уже отдельная тема.
Этим также пользуются в тестировании сборок, чтобы отдельные тесты в отдельных сборках могли обращаться к internal классам, которые тоже подлежат тестированию.
Ответ написан
IamKarlson
@IamKarlson
ASP(?).NET, SQL-разработчик
MSDN дает четко понять что вы не можете обращаться к этим классам, и тем более наследоваться от них
Ответ написан
@p1x

Как уже выше писали, нельзя. Но если очень хочется, то можно. Но лучше так не делать.

Ответ написан
@asvishnyakov
Программист
Если internal сам класс - то нельзя никак.
Если internal конструктор по-умолчанию и нет других public конструкторов - то тоже нельзя.
Если есть public конструктор с параметрами, а вы хотите в своём классе определить дефолтный (без параметров), то вам нужно сделать как-то так:

допустим, конструктор класса-родителя такой:
public A(int param)
{
}

тогда ваш конструктор будет таким:
public B() : base(0)
{
}

где 0 - значение по-умолчанию, которое вы хотите передать;

если вам нужен тоже конструктор с параметром, тогда так:
public B(int a):  base(a)
{
}


Теперь почему. Есть такое понятие - доступность (видимость). В первом случае класс внутренний и вам он не виден вообще. Во втором вы не можете создать его экземпляр через конструктор и, соответсвенно, унаследоваться от него, поскольку вам не виден сам конструктор. Решение третьей проблемы я описал.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы