为什么未使用的重载需要项目引用?

时间:2015-05-11 03:00:59

标签: c# .net

我正在寻找一个解释,为什么包含未引用类的未使用的构造函数重载会在使用该类中的其他构造函数时构建并正确运行时会产生编译时错误。

以下是一些演示此问题的示例代码。

// 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重载的构造函数上失败?

2 个答案:

答案 0 :(得分:3)

编译器在重载解析期间需要该类型。

见这里: https://connect.microsoft.com/VisualStudio/feedback/details/817276/error-cs0012-the-type-is-defined-in-an-assembly-that-is-not-referenced-issued-for-an-extension-method-that-is-not-used

来自连接链接的释义答案:

  

在归属于“ReferencedClass”这个名称的过程中   你的程序,编译器遵循其查找规则来确定   它必须检查的一组方法。两个建设者都拿一个   参数作为重载决策的一部分进行检查。为了   确定哪一个对调用有意义,编译器必须   理解构造函数签名中的所有类型。如果有的话   由于缺少引用而找不到类型,编译器没有   简单地丢弃候选人,而是要求用户提供   缺少的参考文献。

答案 1 :(得分:0)

您的代码示例似乎不完整。正如你在这里引用的那样,它不会重现错误。

如果

,它会重现
  • 你在某个地方有另一个类UnitOfWork,它也有一个Context属性,但是有不同的类型,并且
  • 您在ProjectA中使用了UnitOfWork.Context。

像这样:

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>

 FILE *fr;
 char * line = NULL;
 size_t len =0;
 ssize_t read;

 int main(int argc, char* argv[]){

    fr = fopen(argv[1], "r");
        if(fr==NULL){
            exit(EXIT_FAILURE);
        }

         while ((read = getline(&line, &len, fr)) != -1){
            printf("%s", line );
        }
        fclose(fr);
        if (line){free(line);}
    return 0;
 }

然后在ProjectA中,这将编译正常:

namespace SomeNameSpace
{
    public class UnitOfWork
    {
        public UnitOfWork()
        {
        }
        public string Context { get; set; }
    }
}

即使这样也可以正常编译:

using SomeNamespace;

//...

public void MyFunc()
{
    var unitOfWork = new UnitOfWork();
    // ...
    var context = unitOfWork.Context;
    // ...
}

但这需要额外的参考:

using ProjectB;

//...

public void MyFunc()
{
    var unitOfWork = new UnitOfWork(1);
    // ...
}