C не содержит конструктор который принимает аргументы 0

от admin

Ошибка при наследовании: не содержит конструктор, который принимает 0 аргументов

Тут всё нормально работает. Почему тут ошибка: BasicRoomNS.BasicRoom не содержит конструктор, который принимает 0 аргументов?

Ну собственно все очевидно — базовый тип BasicRoom, от которого наследуется PremiumRoom, не содержит конструктора по умолчанию, потому что вы его не определили. Обычно он создается автоматически (а потому и называется конструктором по умолчанию), но если вы создаете какой-то другой конструктор, то этого не происходит. Однако поскольку PremiumRoom — наследник класса BacicRoom, для его корректной инициализации в нем должна происходить инициализация базового класса, чего вы в данном случае не делаете.Чтобы исправить ошибку вам нужно либо определить конструктор по умолчанию у базового класса, либо вызвать имеющийся конструктор например таким образом:

Почему тут ошибка: BasicRoomNS.BasicRoom не содержит конструктор, который принимает 0 аргументов?

Тут же всё написано. Ты не вызываешь явно базовый конструктор с параметрами, поэтому компилятор пытается неявно вызвать конструктор без параметров, который не был сгенерирован, поскольку есть конструктор с параметрами.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43304

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Не содержит конструктор, который принимает 0 аргументов

Я получаю сообщение об ошибке «Продукты не содержат конструктор, который принимает 0 аргументов» из следующего кода:

Обычное соглашение об именах для классов в единственном, а не во множественном числе (например, Product вместо Products ), поскольку класс определяет тип, который затем может быть создан. Будет ли у вас их больше или нет, не должно зависеть от соглашения об именах. — Aske B.

5 ответы

Здесь вступают в силу несколько правил C#:

Каждый класс должен иметь конструктор (чтобы он был хорошо сконструирован)

Если вы не предоставите конструктор, конструктор будет автоматически предоставлен вам без изменений компилятором.

Это означает, что класс

при компиляции предоставляется пустой конструктор, становящийся

и я могу сделать

Если вы предоставите конструктор (любой конструктор с любой подписью), пустой конструктор не будет сгенерирован.

Это может показаться немного нелогичным, потому что добавление кода, похоже, ломает существующий несвязанный код, но это дизайнерское решение команды C#, и нам придется с этим смириться.

Когда вы вызываете конструктор производного класса, если вы не указываете вызываемый конструктор базового класса, компилятор вызывает пустой конструктор базового класса, поэтому

Итак, чтобы создать производный класс, у вас должен быть конструктор без параметров в базовом классе. Видя, как вы добавили конструктор в Продукты, а компилятор не сгенерировал конструктор по умолчанию, вам нужно явно добавить его в свой код, например:

Класс не содержит конструктор, который принимает 0 аргументов [duplicate]

У меня есть эти 2 класса, которые называются соответственно: Вредоносные и MaliciousSmall:

Код Вредоносный:

Код MaliciousSmall:

Моя проблема в том, что после этого у меня есть реализация класса MaliciousSmall, я получаю следующую ошибку в конструкторе Вредоносный:

Ошибка 53 ‘DataModel.MaliciousCode.MaliciousSmall’ не содержит конструктор, который принимает 0 аргументы C:\Develop\EarlyWarning\public\Implementazione\Ver2\DataModel\MaliciousCode\Malicious.cs 9 18 DataModel

Что я могу сделать, чтобы решить эту проблему?

Я попытался создать пустой конструктор, который принимает объект DataRow как параметрированный, что-то вроде этого:

Но у меня все та же проблема. Что мне не хватает? Что я могу сделать для решения?

6 ответов

Ошибка говорит вам, что конструктор Malicious не может найти подходящий конструктор для привязки к его базовому классу ( MaliciousSmall ).

Исходная проблема заключается в том, что конструктор производного класса неявно содержит этот конструктор:

Или даже когда вы добавили явный конструктор, он все еще пытается привязать к беззаметному:

. но нет такого конструктора без параметров в базовом классе ( MaliciousSmall ), следовательно, ошибка.

Я думаю, вы хотите привязать конструктор к строке (той, которую вы объявили в MaliciousSmall ):

Предполагая, что вы всегда хотите, чтобы строка была предоставлена ​​конструктору. Если вы действительно хотите разрешить создание экземпляра без указания строки, вам нужно добавить конструктор без параметров в базовый класс:

Вероятно, вы захотите, чтобы ваш производный класс имел два конструктора:

Я попытался создать пустой конструктор, который принимает объект DataRow в качестве параметра

Я думаю, что у вас есть термин empty confused. Пустой конструктор не принимает параметры по определению. У вас не может быть пустой конструктор с параметрами.

Если вы хотите сохранить параметр в конструкторе производного класса, вам нужно использовать ключевое слово base , чтобы указать базовый конструктор.

Вы класс Malicious не определили никакого конструктора вообще и из MSDN docs для использования конструкторов

Если класс не является статическим, классы без конструкторов задаются публичный конструктор по умолчанию компилятором С#, чтобы включить класса.

Это означает, что ваш класс имеет:

В производном классе, если конструктор базового класса не вызывается явно используя ключевое слово base , конструктор по умолчанию, если есть один, называется неявно.

Это эффективно означает:

Читать:
Что такое чанки в английском языке

Поскольку ваш базовый класс не имеет конструктора по умолчанию (без параметра), вы получаете ошибку.

Теперь у вас есть две возможности исправить эту ошибку.

  • Определите конструктор по умолчанию в базовом классе.
  • Явно вызов базового конструктора из производного класса.

Вероятно, для вашей ситуации лучше явно вызвать базовый конструктор, поскольку оба конструктора получают одинаковый параметр. Вы можете сделать:

Если вы не хотите добавлять конструктор без параметров, передайте row в конструктор базового класса:

Если вы извлекаете какой-либо класс из базового класса, то вы должны либо добавить беззаметный конструктор в базовый класс, либо специфицировать конструктор базового класса для вызова в производном классе. Поэтому, чтобы решить вашу проблему: Решение 1. Добавьте конструктор без параметров в базовый класс, то есть в MaliciousSmall as,

Решение 2. Задайте конструктор базового класса в конструкторе производного класса, как,

Надеюсь, это поможет вам!

Если в классе нет конструкторов, компилятор предоставляет конструктор по умолчанию/без параметров, который используется для создания экземпляров соответствующих объектов, как показано ниже.

Поскольку вы определили конструктор в базовом классе, компилятор предполагает, что вам не нужен конструктор по умолчанию/без параметров. Когда конструктор по умолчанию MaliciousSmall пытается вызвать конструктор по умолчанию своего базового класса, цепочка конструктора ломается.

Для экземпляра объекта требуется конструктор по умолчанию класса Malicious , который в свою очередь пытается вызвать конструктор по умолчанию базового класса, но поскольку это не существует, цепочка конструкторов ломается.

Рекомендуется использовать требуемые конструкторы, чтобы он не нарушал цепочку.

Конструкторы очень важны, так как я не думаю, что ваша программа попадает куда угодно без экземпляра объекта, пожалуйста, обязательно посетите MSDN и старайтесь читать о this ключевое слово.

Ошибка C #: родительский элемент не содержит конструктора, который принимает 0 аргументов

Ошибка C #: родительский элемент не содержит конструктора, который принимает 0 аргументов

Родительский объект не содержит конструктора, который принимает 0 аргументов.

Я так понимаю проблема в том, что Parent не имеет конструктора с 0 аргументами. Но у меня вопрос: зачем нам конструктор с нулевыми аргументами? Почему без него код не работает?

  • У меня было такое же сообщение об ошибке по другой причине при расширении абстрактного класса внутренним конструктором из другой сборки. В настоящее время это относится к TypeInfo, FieldInfo, . в DotNetCore. Просто хотел поделиться этими знаниями, так как мне потребовались часы, чтобы решить эту проблему.

Поскольку вы явно не вызываете родительский конструктор как часть конструктора дочернего класса, вставлен неявный вызов родительского конструктора без параметров. Этот конструктор не существует, поэтому вы получаете эту ошибку.

Чтобы исправить ситуацию, нужно добавить явный вызов:

Или вы можете просто добавить родительский конструктор без параметров:

  • 9 Наверное, хорошая идея создать protected parent() < >вместо того public .
  • @ Роберто Можешь объяснить почему?
  • 3 @JuanCarlosOropeza Основная причина в том, что до сих пор не было необходимости в родительском конструкторе без параметров, поэтому предполагалось, что потребителям класса он не нужен. Поскольку на самом деле нам нужен только один для любых производных классов, protected является разумным модификатором, поскольку он имеет точную семантику «доступен только для дочерних классов».

Вам нужно изменить конструктор вашего ребенка на:

Вы получали ошибку, потому что конструктор родительского класса принимает параметр, но вы не передаете этот параметр от дочернего элемента к родительскому.

Конструкторы не наследуются в C #, их нужно связывать вручную.

  • Nitpicking: он не получает исключения. Это ошибка компилятора, которую он получает
  • 3 @DanielHilgarth, ты технически прав, лучший из правильных.
  • ребята, кажется, в .net Core FaultException отсутствует один, два и три конструктора параметров. Интересно, решила ли хоть одна проблема. Я переношу старый код на ядро ​​.net

Вам нужно изменить конструктор child класс к этому:

Часть : base(i) означает, что конструктор базового класса с одним int параметр следует использовать. Если он отсутствует, вы неявно указываете компилятору использовать конструктор по умолчанию без параметров. Поскольку в базовом классе такого конструктора нет, он выдает эту ошибку.

Компилятор не может угадать, что следует передать в качестве аргумента базового конструктора. Вы должны сделать это явно:

Вы можете использовать конструктор без параметров в родительском классе:

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

В случае, если базовый класс не имеет конструктора без параметров, вы должны явно вызвать его самостоятельно:

Похожие статьи