5

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

为什么使用另一个引用的项目 B 的方法的重载的项目 A(在其中一个重载签名中使用项目 C 的对象)要求您从项目 A 引用项目 C,即使您从不使用来自项目 A 的对象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

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


另一个例子:

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

B.Test(""); //Call from assembly A compiles


还有一个例子:

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

B.Test("",""); //Fails, CS0012

因此,这可能与重载解决方案的完成方式有关。但是,我不明白为什么编译器不能直接在依赖树上工作并要求我直接引用?无论如何都不必在程序集B中完成重载解决方案吗?

4

0 回答 0