gpt4 book ai didi

c# - IEnumerable 和 IEnumerable 的访问修饰符

转载 作者:行者123 更新时间:2023-11-30 22:55:44 25 4
gpt4 key购买 nike

我是C#的初学者,只是一个关于IEnumerable和IEnumerable的问题。我看到了一些这样的代码:

public class ShoppingCart : IEnumerable<Product>
{
public IEnumerator<Product> GetEnumerator()
{
return Products.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() //why 'public' is not needed?
{
return GetEnumerator();
}
}

我知道第一种方法是实现 IEnumerator<Product>第二种方法是实现IEnumeratorIEnumerator继承自 IEnumerator<Product> ,但我不明白为什么第二种方法不需要“public”访问修饰符?第一种方法确实有“公共(public)”。并且由于两个接口(interface)具有相同的方法签名,所以我们可以看到第二个方法使用 interfacename.methodname 作为显式接口(interface)实现,但为什么第一个方法不需要这个?不应该是:

public IEnumerator<Product>.GetEnumerator()
{
...
}

最佳答案

这一切都归结为接口(interface)成员的隐式和显式实现之间的差异。

  • 显式实现的成员不会出现在对象上,除非对象被强制转换为实现的接口(interface)。如果您希望某人能够调用 new ShoppingCart().GetEnumerator() , 你必须有一个 GetEnumerator不是显式实现的方法。假设它遵守已实现接口(interface)之一的约定,它将隐式实现该接口(interface)上的方法。在这种情况下,您必须指定一个访问修饰符,因为声明该成员的主要目的是使其在该特定类中可用。修饰符必须至少与其实现的接口(interface)一样宽松(并且可能更宽松)。
  • 显式实现接口(interface)成员时,您不需要(事实上,您不能)指定可见性(例如 public ),因为可见性已由接口(interface)本身设置。由于必须将对象转换为该接口(interface)才能访问该成员,因此该成员不被视为具有超出接口(interface)可见性的任何可见性。

代码中的第一个方法可以显式实现,如下所示:

IEnumerator<Product> IEnumerable<Product>.GetEnumerator()
{
return Products.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<Product>)this).GetEnumerator();
}

但是创建该类的人选择隐式实现它,因此无需先将 ShoppingList 转换为 IEnumerable<Product> 就可以使用它。 .请注意这如何使其他方法的实现更容易,因为它们可以简单地调用 this.GetEnumerator()无需投 this第一的。

但由于第二种方法与第一种方法的区别仅在于返回类型,因此不可能隐式实现这两种方法。实现非泛型 IEnumerable 是常见的做法在这些情况下显式接口(interface)。

关于c# - IEnumerable<T> 和 IEnumerable 的访问修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55015989/

25 4 0