[英]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.