为什么在另一个程序集中使用重载时,编译器有时会要求您也引用子程序集?

Mar*_*wie 5 .net c# .net-assembly overload-resolution assembly-references

关于下面提到的编译器错误以及如何解决它,有很多问题/解答,但是这里的问题是询问一些见解,为什么在这种情况下需要这样做。

为什么使用另一个引用的项目B的方法的重载的项目A(在其中一个重载的签名中使用项目C的对象),就要求您引用项目A的项目C,即使您从不使用来自该对象的对象也是如此。项目C?

我想这必须与使用哪种重载有关,但我想了解其背后的概念。

这是一个例子:

将每个类放在自己的程序集中。

//Put into Assembly C
public class C {}

//Put into assembly B, reference C
public class B
{
    public static void Test(string param) //Simple method with one string parameter
    {
    }

    public static void Test(C param) //Overload which uses type of assembly C   
    {
    }
}

//Call placed in method of assembly A which uses and references only assembly B, but not C
B.Test("TestString"); // fails to compile, CS0012
Run Code Online (Sandbox Code Playgroud)

CS0012类型'C'在未引用的程序集中定义。您必须添加对程序集'C,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'的引用。

在处理程序集B的重载时,您会得到有趣的结果,因为并非每个组合都会产生错误:

public static void Test(){}
public static void Test(C param){}

B.Test(); //Call from assembly A compiles
Run Code Online (Sandbox Code Playgroud)


另一个例子:

public static void Test(string param){}
public static void Test(C param, int param2){}

B.Test(""); //Call from assembly A compiles
Run Code Online (Sandbox Code Playgroud)


又一个例子:

public static void Test(string param, string param2){}
public static void Test(C param, int param2){}

B.Test("",""); //Fails, CS0012
Run Code Online (Sandbox Code Playgroud)

因此,这大概必须完成过载解析的完成方式。但是,我不明白为什么编译器不能仅仅在依赖关系树的上游工作,并要求我直接引用?无论如何,是否必​​须在组件B中完成过载解析?