好奇的依赖解析错误

时间:2014-11-07 08:47:39

标签: c# compiler-errors

我最近遇到了一个依赖性解决错误,我希望有人可以解释。

我在第三方程序集(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方法。谁能解释我所看到的行为的原因?

1 个答案:

答案 0 :(得分:1)

在第一次重载中添加bool参数后,编译器现在要检查两个可能的方法签名以选择应该使用的那个(这是重载决议)。

您正在致电Create(string, string)

使用两个参数,您可以使用以下重载:

Create(I3rdParty, bool)
Create(string, string)

显然只有第二个可以匹配(因为string不能为第二个参数隐式转换为bool,但看起来编译器不够聪明且必须知道究竟I3rdParty是什么(这意味着它需要引用定义它的程序集),然后才能确定(I3rdParty, bool)重载不是一个选项。