【问题标题】:Error CS0117: Namespace.A does not contain definition for Interface错误 CS0117:Namespace.A 不包含接口的定义
【发布时间】:2011-02-18 20:17:34
【问题描述】:

我收到了错误:


“Namespace.A”不包含“MyObjectInterface”的定义,并且没有扩展方法“MyObjectInterface”接受类型的第一个参数...


我查看了thisthis,但似乎都不适用。

代码如下:

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 位于单独的程序集/命名空间中
    • Base 和 A 位于相同的程序集/命名空间中,每个都有正确的 using 指令
    • 实现在第三个单独的程序集命名空间中,也具有正确的 using 指令。
  • 在尝试设置 MyObjectInterface 之前转换为 A 不起作用

  • 具体来说,我正在尝试将 MyObjectInterface 的值设置为模拟对象(不过,我创建了一个假对象,但无济于事)

我已经尝试了我能想到的一切。在我失去更多头发之前请帮忙。

编辑 我也无法通过创建测试应用来重现错误,这就是我在这里的原因以及我感到沮丧的原因。

@Reed Copsey: /* something */ 要么是 NUnit.DynamicMock(IMailer).MockInstance 要么是我创建的 Fake 对象,它继承自 IObject 并且只返回预设值。

@Preet Sangha:我检查过,没有其他引用的程序集有 IObject 的定义(具体来说,它称为 IMailer)。

事情是智能感知获取属性,但是当我编译时,我得到 CS0117。我什至可以在实现中“转到定义”,它会将我带到我定义它的地方。

【问题讨论】:

  • 我创建了一个虚拟项目,并在单独的程序集中使用 IObject,而这段代码在另一个程序集中。一切都很好编译。我强烈怀疑有不同的问题导致了这个问题。您是否通过确保不会从您需要的实现中从其他地方获取对 IObject 的引用来确认。
  • 什么是“Type”的错误报告以及“/* something */”是如何定义的?这两个问题对于正确回答您至关重要......

标签: c# assemblies namespaces compiler-errors


【解决方案1】:

该错误与您在引用使用在另一个程序集中定义的类型的程序集并且您没有引用依赖项的依赖项时遇到的错误有些一致。

要解决此问题,请添加对包含 IObject 的程序集的引用作为对包含 Implementation 的项目的引用。

这是一个小图表。如果 Assembly2 公开了在 Assembly3 中定义的类型,则 ASsembly1 也必须引用 Assembly3。以下情况将不起作用:

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

只有在 Assembly3 中定义的类型可通过 Assembly2 访问时才会出现此问题。这将是以下情况之一:

  • Assembly2 中定义的类型派生自 Assembly3 中的类型。
  • Assembly2 中定义的方法使用 Assembly3 中的类型作为返回类型或作为参数。
  • Assembly2 中定义的类型将 Assembly3 中的类型公开为属性或公共字段。

您需要从 Assembly1 添加对 Assembly3 的引用以使其编译。

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

【讨论】:

    猜你喜欢
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2018-09-29
    • 2019-11-02
    • 1970-01-01
    相关资源
    最近更新 更多