簡體   English   中英

隱式內部接口實現

[英]implicit internal interface implementation

當我有一個公共界面

public interface IPub { string Foo { get; set; } }

然后我可以通過顯式實現這個接口:

public class CFoo : IPub { string IPub.Foo { get; set; } }

或者通過使用public修飾符隱式地:

public class CFoo : IPub { public string Foo { get; set; } }

有道理:修飾符必須是public因為接口是public

但是當我有一個內部接口

internal interface IInt { string Bar { get; set; } }

然后我只能明確地實現它:

public class CBar : IInt { string IInt.Bar { get; set; } }

或隱式使用public修飾符:

public class CBar : IInt { public string Bar { get; set; } }

,但不是internal修飾符:

public class CBar : IInt { internal string Bar { get; set; } }
// compiler error:
//     'CBar' does not implement interface member 'IInt.Bar'.
//     'CBar.Bar' cannot implement an interface member
//      because it is not public.

這毫無意義。 當界面只是internal時,為什么我需要一個public修飾符? 是否有任何技術原因導致public必須始終在隱式接口實現中使用,或者C#開發人員是否可以使其不同(不需要更改語言中的大量內容)?

修飾符必須是公共的,因為接口是公共的。

雖然這將是一種確定它方式:這不是編譯器想要的。 對於隱式接口實現(無論接口類型的可見性如何),必須將成員聲明為public ,no“ifs”,“buts”或“maybes”( 實現類型 ,但是,可以是任何可見性級別)

語言設計者絕對可以看到更復雜的規則,但是:由於還有一個顯式接口實現的選項,他們可能並不認為有必要這樣做。


具體來說,這是規范(v5)中的§18.6.5(“接口映射”) - 強調我的(“I”=接口類型,“M”=成員,“S”=實現類型):

  • 如果S包含與I和M匹配的顯式接口成員實現的聲明,則此成員是IM的實現
  • 否則,如果S包含與M匹配的非靜態公共成員的聲明,則此成員是IM的實現如果多個成員匹配,則未指定哪個成員是IM的實現這種情況只有在S才會發生是一個構造類型,其中泛型類型中聲明的兩個成員具有不同的簽名,但類型參數使它們的簽名相同。

暫無
暫無

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

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