我最近遇到了一个依赖性解决错误,我希望有人可以解释。
我在第三方程序集(I3rdParty
)中定义了一个接口,一个依赖于该程序集的“公共”程序集和一个依赖于“公共”程序集的“客户端”库。
我们称之为3rdparty.dll,common.dll和client.dll。
client.dll不应该依赖于3rdparty.dll。
在common.dll中定义了以下内容:
public static class Factory
{
public static object Create(I3rdParty ifc) { ... }
public static object Create(string value1, string value2, long? value3 = null) { ... }
}
其中一个工厂方法来自client.dll,如:
var instance = Factory.Create("SomeValue", "SomeValue2");
此时一切都按预期工作。
然后在common.dll中的第一个工厂方法中引入了bool参数,因此它变为:
public static object Create(I3rdParty ifc, bool value) { ... }
然后,client.dll的构建由于缺少对3rdparty.dll的依赖而开始失败,例如:
The type 'I3rdParty' is defined in an assembly that is not referenced...
我假设这与方法有关,方法现在接受相同数量的参数(因为第二个Create方法的第三个参数默认为null)。
但我认为它仍然可以根据参数的类型选择正确的Create方法。谁能解释我所看到的行为的原因?
答案 0 :(得分:1)
在第一次重载中添加bool
参数后,编译器现在要检查两个可能的方法签名以选择应该使用的那个(这是重载决议)。
您正在致电Create(string, string)
使用两个参数,您可以使用以下重载:
Create(I3rdParty, bool)
Create(string, string)
显然只有第二个可以匹配(因为string
不能为第二个参数隐式转换为bool
,但看起来编译器不够聪明且必须知道究竟I3rdParty
是什么(这意味着它需要引用定义它的程序集),然后才能确定(I3rdParty, bool)
重载不是一个选项。