簡體   English   中英

為什么未使用的重載需要項目引用?

[英]Why do unused overloads require a project reference?

我正在尋找一個解釋,為什么在使用該類中的其他構造函數將構建並正確運行時,包含未引用類的未使用的構造函數重載會產生編譯時錯誤。

這是一些演示該問題的示例代碼。

// 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-for -an延伸法-即-是-未使用

來自連接鏈接的釋義答案:

在將程序中的名稱“ReferencedClass”歸為意義的過程中,編譯器遵循其查找規則來確定必須檢查的方法集。 兩個構造函數都采用一個參數作為重載決策的一部分進行檢查。 為了確定哪一個對調用有意義,編譯器必須理解構造函數簽名中的所有類型。 如果由於缺少引用而找不到某些類型,則編譯器不會簡單地丟棄候選者,而是要求用戶提供缺少的引用。

看起來您的代碼示例不完整。 正如你在這里引用它,它不會重現錯誤。

它會重現如果

  • 你在某個地方有另一個類UnitOfWork,它也有一個Context屬性,但是有一個不同的類型,和
  • 您在ProjectA中使用UnitOfWork.Context。

像這樣:

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

然后在ProjectA中,這將編譯正常:

using SomeNamespace;

//...

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

即使這樣編譯也可以:

using ProjectB;

//...

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

但這需要額外的參考:

using ProjectB;

//...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM