2014-06-29 47 views
3

我需要在可訪問性爲internal的嵌套類中覆蓋Equals運算符(並因此覆蓋GetHashcode方法)。在嵌套內部類中覆蓋運算符

當我嘗試這樣做時,編譯器會抱怨我無法用private方法覆蓋Equals - public成員。但是我不能使覆蓋public,因爲類本身是internal,並嵌套。

怎樣才能做到這一點?我如何覆蓋EqualsGetHashcode的類不是public(實際上,它是嵌套的,而且是internal)?

+0

你能後的代碼你已經嘗試 – Gun

+0

不容易。我希望這個問題是足夠普遍的有一個普遍的答案,就像「你需要創建一個明確的接口的實現......」 –

+0

「但我不能公開重寫,因爲類本身是內部的,並嵌套「 - 爲什麼?你有沒有嘗試過? –

回答

3

雖然我不確定它爲什麼有效。

此行爲是在C#規範的3.5.2§定義:

程序P內的類型聲明T嵌套構件M的可訪問域定義如下(注意M本身可能是一個類型):[...]

  • 如果M的聲明可訪問性是internalM訪問域是T的可訪問性域與P的程序文本的交集。

這規定要求,對於具有內部可訪問一個類,類型成員可等效標記無論是作爲公共或內部。

你不能有一個成員的訪問級別高於它包含類?

這是準確的;該規範的同一部分聲明「成員的可訪問域永遠不會比成員聲明類型的可訪問域更具包容性」。儘管該語言允許內部可訪問類型的成員被宣佈爲作爲公共,但它仍將具有內部可訪問性(就好像它被聲明爲內部),這一點很重要。

換句話說,在下面的部分中,X無障礙是兩條線相當於:

internal class A {public void X() {}} 
internal class A {internal void X() {}}