【发布时间】:2015-04-30 14:26:57
【问题描述】:
我最近偶然发现了一个我无法解释的奇怪问题,如果有人能解释为什么会发生这种情况,我会很高兴。
我遇到的问题如下:
我有一个已实现的接口,如下所示:
namespace InterfaceTwo
{
public interface IA { }
}
namespace InterfaceTwo
{
public class A : IA { }
}
还有另一个在不同项目中实现的接口,如下所示:
namespace InterfaceOne
{
public interface IB { }
}
namespace InterfaceOne
{
public class B : IB { }
}
我有一个在其构造函数中使用这些接口的对象,如下所示:
using InterfaceOne;
using InterfaceTwo;
namespace MainObject
{
public class TheMainObject
{
public TheMainObject(IA iaObj) { }
public TheMainObject(IB iaObj) { }
}
}
最后,我有一个聚合上述对象的类,如下所示:
using InterfaceTwo;
using MainObject;
namespace ReferenceTest
{
public class ReferenceTest
{
public void DoSomething()
{
var a = new A();
var theMainObject = new TheMainObject(a);
}
}
}
奇怪的是,这段代码无法编译并出现以下错误:
类型“InterfaceOne.IB”在未引用的程序集中定义。
您必须添加对程序集“InterfaceOne,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”的引用。
c:\users\harry.baden\documents\visual studio 2013\Projects\ReferenceTest\ReferenceTest\ReferenceTest.cs 11 13 ReferenceTest
我还发现,如果我更改其中一个重载以包含一个额外的参数 - 它确实会编译...是什么让我想到这个问题可能与编译器正在运行的某种反射问题有关。
谢谢,
巴拉克。
【问题讨论】:
-
右键单击项目并通过添加对文件的引用来确保正确引用程序集->重建并查看会发生什么
-
您需要在 Visual Studio 解决方案资源管理器中(在您的测试项目下)添加对 interfaceOne 创建的程序集文件的引用。看这里:msdn.microsoft.com/en-us/library/7314433t%28v=vs.90%29.aspx
-
这不是引用问题,因为我不希望 ReferenceTest 知道接口 IB 或 B 类。我还提到过 - “我还发现,如果我更改其中一个重载以包含一个额外的参数 - 它确实编译......”。我假设问题与具有相同参数数量的重载之一具有 IB 的事实有关,因此,在编译时,它也需要知道 IB。