If project A has an interface A, and project B has a class B that implements interface A, then project B needs a reference to project A.
In project B:
public class B : A
{
void A.MethodA()
{
}
}
But if project C uses class B, without ever using it as the interface A (so no code that calls A's method on an instance of B or casts an instance of B to A), then it must still reference project A. Even if project B explicitly implements interface A (as the example code above does).
In project C:
public class C
{
public C()
{
var b = new B();
}
}
The result is:
The type 'A' is defined in an assembly that is not referenced. You must add a reference to assembly 'A, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.
Why is that?