我正在寻找一种解释,为什么当使用未创建的包含未引用类的构造函数重载该类中的其他构造函数时,该重载会生成编译时错误,并且为什么该构造函数可以正确运行。
这是一些演示此问题的示例代码。
// Console Project - references CL1 but not CL2
static void Main(String[] args)
{
var rc1 = new ReferencedClass(); // compiles and runs
var rc2 = new ReferencedClass(1); // wont compile. Needs CL2 reference
var rc3 = new ReferencedClass(0, ""); // compiles and runs
}
// Class Library 1 (CL1) - references CL2
public class ReferencedClass
{
private UnreferencedClass _unreferencedClass;
public ReferencedClass()
{
_unreferencedClass = new UnreferencedClass();
}
public ReferencedClass(Int32 id)
{
_unreferencedClass = new UnreferencedClass();
}
public ReferencedClass(UnreferencedClass uf)
{
_unreferencedClass = uf;
}
public ReferencedClass(Int32 id, String name)
{
_unreferencedClass = new UnreferencedClass();
}
}
// Class Library 2 (CL2)
public class UnreferencedClass {}
在所有情况下,都不会使用带有未引用类的构造函数,那么为什么在Int32
重载的构造函数上构建失败?
在重载解析期间,编译器需要该类型。
参见此处:https : //connect.microsoft.com/VisualStudio/feedback/details/817276/error-cs0012-the-type-is-defined-in-an-assembly-that-is-not-referenced-issued-一种未使用的扩展方法
连接链接的解释答案:
在将程序中的名称“ ReferencedClass”赋予含义的过程中,编译器将遵循其查找规则来确定必须检查的方法集。作为重载解析的一部分,将两个采用一个参数的构造函数进行检查。为了确定哪种调用有意义,编译器必须了解构造函数签名中的所有类型。如果由于缺少参考而找不到某些类型,则编译器不会简单地丢弃候选对象,而是要求用户提供缺少的参考。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句