Причина в том, что интерфейс 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)
{
...
}
Поскольку I
является публично видимым как часть C
(например, вы можете назначить C
для ссылки типа I
и т. Д.), Сборка 3, которая хочет использовать C, требует как определение C
(сборка 2) и I
(сборка 1)
Однако, если C
использует I
внутри (невидимо для других сборок), вам не нужно ссылаться на сборку 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)
{
...
}
Это имеет смысл? Поскольку базовые классы и интерфейсы класса являются частью его определения, они должны быть известны любым ссылочным сборкам. Но если они используются внутри, но не видны снаружи, то они не обязательно должны быть известны любым ссылочным сборкам.