我有一个名为Primes的类,这个类实现了GetEnumerator()而没有实现IEnumerable接口。
public class Primes
{
private long min;
private long max;
public Primes()
: this(2, 100)
{
}
public IEnumerator GetEnumerator()
{...}
我不明白。我错过了什么吗?
答案 0 :(得分:8)
首先,正如其他人所说,你可以在不实现接口的情况下引入自己的方法 - 你可以编写自己的Dispose
方法而不实现IDisposable
等。对于众所周知的接口,我建议这样做几乎是一个坏主意(因为读者会有一定的期望)但它完全有效。
更重要的是,C#中的foreach
语句可以在没有IEnumerable
的情况下工作。编译器有效地对名称GetEnumerator()
,Current
和MoveNext()
进行编译时鸭子输入。这主要是为了允许在泛型之前在C#1中进行强类型(和非装箱)迭代。有关详细信息,请参阅C#3规范的第8.8.4节。
但是,如果您做希望能够轻松地将实例的内容作为集合进行迭代,那么现在执行此操作通常是一个坏主意 - 事实上我建议实现{{ 1}}而不仅仅是IEnumerable<T>
。
答案 1 :(得分:1)
foreach
中使用它。唯一的问题是,虽然这个类的对象实现了所需的方法,但它们无法转换为IEnumerable
。
答案 2 :(得分:1)
您没有必要实施IEnumerable
来创建名为GetEnumerator
的函数,该函数返回IEnumerator
,这意味着您将无法提供该类型的实例需要IEnumerable
。
答案 3 :(得分:0)
接口确保了一个契约,这并不意味着你不能拥有一个方法与一个没有实现接口的类接口中的签名相同的方法。