Ошибка CS0117: Namespace.A не содержит определения для интерфейса - PullRequest
0 голосов
/ 13 мая 2010

Я получаю сообщение об ошибке:


«Namespace.A» не содержит определения для «MyObjectInterface» и метода расширения «MyObjectInterface», принимающего первый аргумент типа ...


Я смотрел на это и это и, похоже, ни один из них не подходит.

Код выглядит так:

public abstract class Base
{
    public IObject MyObjectInterface { get; set; }
}

public class A : Base
{
    /**/
}

public class Implementation
{
    public void Method()
    {
        Base obj = new A();
        obj.MyObjectInterface = /* something */; // Error here
    }
}
  • IObject определен в отдельной сборке, но:

    • IObject находится в отдельной сборке / пространстве имен
    • База и A находятся в одной сборке / пространстве имен, каждое с правильными директивами
    • Реализация находится в третьем отдельном пространстве имен сборки, также с правильными директивами использования.
  • Приведение к A перед попыткой установить MyObjectInterface не работает

  • В частности, я пытаюсь установить значение MyObjectInterface для фиктивного объекта (хотя вместо этого я создал фальшивку)

Я перепробовал все, что мог придумать. Пожалуйста, помогите, прежде чем я потеряю больше волос.

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

@ Рид Копси: / * что-то * / является либо NUnit.DynamicMock (IMailer) .MockInstance, либо созданным мной поддельным объектом, который наследуется от IObject и просто возвращает стандартные значения.

@ Преет Сангха: Я проверил, и ни у одной другой сборки, на которую есть ссылка, нет определения для IObject (в частности, это называется IMailer).

Дело в том, что intellisense забирает свойство, но когда я компилирую, я получаю CS0117. Я могу даже «перейти к определению» в реализации, и это приведет меня туда, где я его определил.

1 Ответ

3 голосов
/ 13 мая 2010

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

Чтобы исправить это, добавьте ссылку на сборку, содержащую IObject, в качестве ссылки на проект, содержащий Implementation.

Вот небольшая диаграмма. Если Assembly2 предоставляет тип, определенный в Assembly3, то ASsembly1 также должен ссылаться на Assembly3. Следующая ситуация не будет работать:

_____________             _____________               _____________
| Assembly1  |references  | Assembly2  |references    | Assembly3  |
|           -|------------|->         -|--------------|->          |
|            |            | public     |              | IObject    |
|            |            |  IObject   |              |            |
|            |            |            |              |            |
-------------             -------------               -------------

Это проблема, только когда тип, определенный в Assembly3, доступен через Assembly2. Это будет в одной из следующих ситуаций:

  • Тип, определенный в Assembly2, происходит от типа в Assembly3.
  • Метод, определенный в Assembly2, использует тип из Assembly3 в качестве возвращаемого типа или в качестве аргумента.
  • Тип, определенный в Assembly2, предоставляет тип из Assembly3 в качестве свойства или открытого поля.

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

_____________             _____________               _____________
| Assembly1  |references  | Assembly2  |references    | Assembly3  |
|           -|------------|->         -|--------------|->          |
|            |            | public     |              | IObject    |
|            |references  |  IObject   |              |            |
|           -|------------|------------|--------------|->          |
|            |            |            |              |            |
-------------             -------------               -------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...