为什么我得到:类型 'IThirdParty' 是在未引用的程序集中定义的。您必须添加对程序集 'ThirdPartyAssembly' 的引用吗?

Why am I getting: The type 'IThirdParty' is defined in an assembly that is not referenced. You must add a reference to assembly 'ThirdPartyAssembly'?

假设有第三方程序集 ThirdPartyAssembly.dll 公开以下内容:

namespace ThirdPartyAssembly
{
    public interface IThirdParty
    {
        void GetInstance(ThirdPartyInfo info);
    }

    public class ThirdPartyInfo
    {
        public ThirdPartyInfo(string instanceText);
        public string InstanceText { get; set; }
    }
}

在解决方案的项目之一 MyAssembly 中,我参考了 ThirdPartyAssembly.dll 并实现了以下代码:

namespace MyAssembly
{
    public abstract class AbstractMyClass1 : IThirdParty
    {
        void IThirdParty.GetInstance(ThirdPartyInfo info)
        {
            info.InstanceText = "some-text";
        }
    }

    public abstract class AbstractMyClass1Consumer<T>
        where T : AbstractMyClass1
    {
    }
}

在第二个解决方案项目MyAssemblyConsumer中,我参考了MyAssembly(作为解决方案项目参考)并实施了以下分类

namespace MyAssemblyConsumer
{
    class MyClass1 : AbstractMyClass1
    {
    }

    class MyClass1Consumer : AbstractMyClass1Consumer<MyClass1>
    {
    }
}

到目前为止一切都编译得很好。 但是,当我将 IMyClass2 添加到继承 IThirdParty 接口的 MyAssembly 项目时,具有以下抽象 类

namespace MyAssembly
{
    public interface IMyClass2 : IThirdParty
    {
    }

    public abstract class AbstractMyClass2 : IMyClass2
    {
        void IThirdParty.GetInstance(ThirdPartyInfo info)
        {
            info.InstanceText = "some-text";
        }
    }

    public abstract class AbstractMyClass2Consumer<T>
        where T : IMyClass2
    {
    }
}

并尝试将以下 类 实施到 MyAssemblyConsumer

namespace MyAssemblyConsumer
{
    class MyClass2 : AbstractMyClass2
    {
    }
    class MyClass2Consumer : AbstractMyClass2Consumer<MyClass2>
    {
    }
}

我在 MyClass2Consumer 上遇到以下编译错误:

类型 'IThirdParty' 在未引用的程序集中定义。您必须添加对程序集的引用 'ThirdPartyAssembly'

为什么我在第一种情况下不需要参考ThirdParty.dll,但在第二种情况下需要这个参考?

发生这种情况是因为在第一种情况下您 "hide" 您对 ThirdPartyAssembly.dll 的引用。是的,你的 public AbstractMyClass1 从它实现了 IThirdParty,但是它实现了它 implicitly 所以调用 IThirdParty.GetInstance() 方法的唯一方法是这样的:

var myClass1Instance = new MyClass1();
var info = new ThirdPartyInfo(); 

(myClass1Instance as IThirdParty).GetInstance(info); // this can be called
myClass1Instance.GetInstance(info); // <- this method doesn't exists

因此,在您的 MyAssemblyConsumer 项目编译时,编译器不需要了解任何有关 IThirdParty 的信息。正如你所说你的第一个案例编译成功,我想你没有这样的代码。

在第二种情况下,您通过 public IMyClass2 接口公开了 IThirdParty of ThirdPartyAssembly.dll。在这种情况下,编译器必须在编译时知道 IThirdParty 接口(在你定义 AbstractMyClass2Consumer<T> 的那一行),这就是你得到这个异常的原因。