跨项目的接口参考

Joh*_*ny5 0 c# interface reference

我有3个项目:P1,P2和P3

在P1中,有一个接口I的定义

在P2中,有一个实现接口I的C类

public class C : I
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

在P3中,我在一个类中有这个方法:

public static C getC (int id)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

在编译时,P3不编译,因为接口I是在未引用的项目中定义的.为什么?

请注意,我没有使用P3中的接口,我使用具体类.

Jam*_*are 5

原因是因为接口I是公共签名的一部分C,因此当你使用C它时也必须知道接口定义.因此,它需要参考组件.

为了显示:

// Assembly 2
public class C : I
{
    ...
}

// Assembly 3 - needs definition of `I` from assembly 1 because part of `C`
// public definition.
public static C getC (int id)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

因为I作为一部分公开可见C(例如,您可以C为类型的引用分配I等),想要使用C的程序集3需要C(程序集2)和I(程序集1)的定义

但是,如果CI内部使用(对其他程序集不可见),则不需要引用I要使用的程序集C.例如:

// Assembly 2
public class C 
{
    private I _someInternalUseOfI = ...;
    ...
}

// Assembly 3 - Since in this case, `I` is only used privately in assembly 2,
// only assembly 2 needs the reference to `I` in assembly 1.
public static C getC (int id)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

那有意义吗?因为类的基类和接口是其定义的一部分,所以任何引用程序集都需要知道它们.但是如果它们在内部使用但在外部不可见,则它们不一定需要被任何引用程序集所知.