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