.Net继承 - 自动依赖引用行为问题

Min*_*Min 7 c# inheritance dependencies reference

我遇到了一个我刚刚注意到的奇怪问题.

如果您有3个项目的解决方案

**注意讨论后编辑**

项目LibA - 拥有ClassA

namespace LibA
{
    public class ClassA
    {
        public override string ToString()
        {
            return "The logic in class A!";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

项目LibB - 拥有ClassB

using LibA;

namespace LibB
{
    public class ClassB
    {
        public ClassA a;

        public ClassB()
        {
            a = new ClassA();
        }

        public object Foo()
        {
            return a;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

LibC项目 - 拥有ClassC

using LibB;

namespace LibC
{
    public class ClassC
    {
        public ClassB b;

        public ClassC()
        {
            b = new ClassB();
        }

        public object Foo()
        {
            return b.Foo();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

最后是测试驱动程序

using System;
using LibC;

namespace Shell
{
    class Program
    {
        static void Main(string[] args)
        {
            ClassC c = new ClassC();
            Console.WriteLine(c.Foo());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在如果你编译它,一切都会完美.如果你检查LibC的二进制文件夹的内容,你会看到它自动遍历依赖链,以确定它需要拉入LibA和LibB

但是,如果您将ClassB更改为继承自A类,例如

using LibA;

namespace LibB
{
    public class ClassB : ClassA
    {
        ClassA a;
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试编译,你会得到错误

错误2"LibA.ClassA"类型在未引用的程序集中定义.您必须添加对程序集"LibA,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null"的引用.

**原始问题**

有没有人知道为什么(无论是msbuild还是visual studio),当ClassA成为ClassB的成员时,它足够聪明地引用LibA,但是当ClassA是ClassB的基类时,它不足以引用LibA?

我知道这很挑剔,但我真的很感激一些一贯的行为

**这些观察到的测试的修正问题**

我听到一些人定义为"直接"或"间接"的引用.但是,直接显然不仅仅是可见性范围,它似乎是一种类型的继承和实际使用.

没有继承,测试驱动程序足够聪明,可以解析并自动引用LibA,LibB和LibC.

在ClassB中有一个公共成员ClassA可见,但仅此一项不会产生编译/链接错误.

调试器肯定会从测试驱动程序中解析ClassA,因此它显然加载了正确的程序集.

所有这一切都在考虑之中.我现在得到了整个"直接"和"间接"的东西.

还没有点击我的话,为什么链接器/编译器/ IDE至少不会尝试在"直接"场景中自动引用引用库的依赖关系?显然足够聪明,可以知道依赖关系,并在"间接"场景中引用它们.

Ter*_*ver 0

我知道这很挑剔,但我真的很欣赏一些一致的行为

这是一致的。您必须引用直接使用的任何类型。间接引用被透明地解决。