簡體   English   中英

為什么編譯器發現這個含糊不清?

[英]Why does the compiler find this ambiguous?

在我的基類中,我有一個泛型方法(理想情況下,這將是一個屬性,但你不能擁有泛型屬性)和一個非泛型屬性,兩者都具有相同的名稱:

protected static T CurrentUserId<T>()
{
    ...
}

protected static string CurrentUserId
{
    get
    {
        ...
    }
}

然而,當我來使用它們中的任何一個時,intellisense報告它們之間的歧義。 當然, base.CurrentUserId (沒有parethesese)為我想要調用非泛型屬性的編譯器提供了足夠的線索?

有誰知道為什么編譯器會與此斗爭? 提前致謝。

括號不提供足夠的信息,因為您並不總是使用它們。 這就是為什么這不起作用:

delegate T MyDelegate<T>();

new MyDelegate(myClass.CurrentUserId)

//are we talking about the method or the property?

如果你省略了泛型,比如:

public int Value { get;  set; }

public int Value()
{
    return 1;
}

您還會收到錯誤:Type ...已包含Value的定義

我可以想到一個存在明顯沖突的案例:

MyDelegate foo = new MyDelegate(Value);

保羅關於如何“將泛型引入混合似乎完全掩蓋這個更基本的問題”的評論似乎是正確的。

我相信你的問題與泛型有關,而更多地與如何適當地重載方法有關(我可能在這方面錯了,但這是我從查找方法重載中收集的)。 我甚至不確定屬性是否可以通過具有相同名稱的方法重載,但無論如何,讓我們快速查看方法重載,這仍然應該說明為什么代碼不起作用。

如果方法的簽名不同,則可以重載具有相同名稱的方法(在您的情況下,名稱為CurrentUserId )。 簽名包含以下四條信息:

  • 方法的名稱
  • 參數個數
  • 數據類型和參數的順序
  • 參數修飾符

根據Daniel Solis的插圖C#2008

“返回類型不是簽名的一部分 - 盡管認為它是一個常見的錯誤。”

讓我們看看你的屬性和方法,看看它們是否可以根據上面提供的四條信息使用相同的簽名:

  • 方法的名稱是否相同? 是的, CurrentUserId
  • 參數個數是否相同? 是的,0。
  • 數據類型和參數順序是否相同? 兩者都沒有參數,所以是的。
  • 參數修飾符是否相同? 同樣,屬性和方法都沒有參數,所以是的,它們是相同的。

當您從等式中刪除參數時,我們唯一要唯一標識類型的是其名稱。 此外,由於方法(或屬性)的返回類型不是其簽名的一部分,因此一種類型是字符串而另一種類型是通用類型並不重要。 無論哪種方式,兩者都具有相同的簽名(因為它們的名稱相同且沒有參數),編譯器將無法正確區分它們。

所有這一切,我不確定這是否恰好回答了你的問題(或者即使我正確地解決了這個問題......我很高興歡迎評論中的更正,以促進我個人的理解)。 但是,我發現通過首先正確理解重載來解決問題非常有助於解決編譯器如何處理代碼的整體問題。

我希望這有幫助。

暫無
暫無

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

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