【问题标题】:implementing IEnumerable<T> and IEnumerable.GetEnumerator() can not be public, why?实现 IEnumerable<T> 和 IEnumerable.GetEnumerator() 不能公开,为什么?
【发布时间】:2015-09-20 07:18:55
【问题描述】:

要实现一个接口成员,对应的成员 实现类必须是公共的。来源:Interfaces (C# Programming Guide)

如果它是私有的,我知道它可以工作,但我想了解为什么它不能公开?

【问题讨论】:

  • 当您使用接口名称显式实现接口的成员时,该成员将具有与接口本身相同的访问权限,并且无法修改。公共接口有公共成员。所以你可以说public IEnumerator GetEnumerator(),隐式实现接口或者IEnumerator IEnumerable.GetEnumerator()

标签: c# .net enumerator ienumerator


【解决方案1】:

当显式实现时,接口方法默认是公共的,这就是你不能使用访问修饰符的原因。

来自 msdn.com 的引述:

当显式实现成员时,无法通过 一个类实例,但只能通过接口的一个实例 (默认是公开的)

来源:https://msdn.microsoft.com/en-us/library/aa288461%28v=vs.71%29.aspx

附: 隐式和显式实现的区别:

interface MyInterface
{
   void MyMethod();
}

class A : MyInterface  // Implicit implementation
{
   public void MyMethod () { ... }
}

class B: MyInterface   // Explicit implementation
{
   void MyInterface.MyMethod () { ... }
}

【讨论】:

  • 附加链接:msdn.microsoft.com/en-us/library/ms173157.aspx(类实现两种不同的 Paint 方法的部分)和msdn.microsoft.com/en-us/library/aa288461(v=vs.71).aspx(When a member is explicitly implemented, it cannot be accessed through a class instance,)。这在 .net 框架中使用,例如在显式实现IList.Count 的数组中(因此它在数组上不直接可见)
  • 谢谢。所以显式实现意味着,实现你正在实现的接口继承的任何东西。
  • 关闭但隐式实现是指在类上实现接口方法而不显式指向接口名称。我已更新我的答案以显示差异。
  • 我认为 cmets 应该在方法上。您的示例意味着您必须选择隐式或显式地实现类(整体)。没有什么能阻止你隐式地实现接口的一部分而显式地实现另一部分
猜你喜欢
  • 1970-01-01
  • 2011-07-29
  • 2011-04-04
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多