Вызов базовых конструкторов не работает c # - PullRequest
2 голосов
/ 22 февраля 2012

У меня есть следующий код, возвращающий ошибку: «объект» не содержит конструктор, который принимает x аргументов ».на линии пытается вызвать базовый конструктор.

Решение 1, проект 1

namespace Project.Sub.A
{
  internal class Foo
  {
    internal Foo(int a, long b) {}

  }
}

Решение 1, проект 2

namespace Project.Sub.B{
  internal class Bar : Foo
  {
    internal Bar(int a, long b,long c) :base(a,b+c) {}

  }
}

Я понятия не имею, почему это не хочет работать.Может быть, мои пространства имен настроены неправильно?

Ответы [ 4 ]

8 голосов
/ 22 февраля 2012

internal доступ предоставляется для сборки , а не для пространства имен.

Поскольку конструктор в базовом классе объявлен internal, он не доступен для подкласса в другом проекте. Попробуйте изменить его на protected internal или просто protected.

обновление

Только что заметил, что базовый класс тоже internal. Вам нужно будет сделать это public, если вы хотите, чтобы это было видно во втором проекте. Или вы можете добавить [assembly:InternalsVisibleTo("Project2")] в AssemblyInfo.cs в Project1. (Хотя я бы лично не рекомендовал этот вариант.)

3 голосов
/ 22 февраля 2012

Здесь есть ряд смежных вопросов.

  • Во-первых, ваши классы определены как внутренние в двух отдельных проектах. internal означает, что класс виден только внутри своей сборки, а не для клиентского кода вне сборки. Foo должен быть публичным, чтобы его можно было использовать в других сборках
  • Если вы сделаете класс Foo видимым за пределами сборки, вам придется ссылаться на эту сборку из проекта, который содержит класс Bar
  • И вам нужно будет убедиться, что на пространства имен также ссылаются правильно
2 голосов
/ 22 февраля 2012

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

Изменить Foo 'accessor на public.

2 голосов
/ 22 февраля 2012

внутреннее означает visible to other classes in the current assembly

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

Попробуйте создать класс Foo и конструкторprotected вместо или internal.

...