为什么我得到:类型 '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>
的那一行),这就是你得到这个异常的原因。
假设有第三方程序集 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>
的那一行),这就是你得到这个异常的原因。