C# 为什么在实现IEnumerator的类中需要IEnumerator.Current<;T>;?
我有一个类实现了C# 为什么在实现IEnumerator的类中需要IEnumerator.Current<;T>;?,c#,.net,ienumerator,C#,.net,Ienumerator,我有一个类实现了IEnumerator。见下文: public class MyClass : IEnumerator<string> { public bool MoveNext() { //.... } //Implement other required methods.... //Confusion lies below: public string Current { get { return this.Cur
IEnumerator
。见下文:
public class MyClass : IEnumerator<string>
{
public bool MoveNext()
{
//....
}
//Implement other required methods....
//Confusion lies below:
public string Current { get { return this.CurrentLine; } }
//Why do I need to implement IEnumerator.Current?! In my tests, it's not even called during my iteration
object IEnumerator.Current { get { throw new NotImplementedException(); } }
}
公共类MyClass:IEnumerator
{
公共图书馆
{
//....
}
//实施其他必要的方法。。。。
//困惑如下:
当前公共字符串{get{返回this.CurrentLine;}}
//为什么我需要实现IEnumerator.Current?!在我的测试中,在我的迭代过程中甚至没有调用它
对象IEnumerator.Current{get{throw new NotImplementedException();}}
}
除了.Current属性同时存在于IEnumerator
接口和IEnumerator
接口(由IEnumerator
继承)上之外,实现它还有什么意义?如上所述,它甚至没有被调用。IEnumerator
实现了IEnumerator
,因此在最基本的层面上,您必须履行合同
特别是为什么-如果有人这样做会发生什么:
((IEnumerator)yourInstance).Current
他们(通常)应该期望得到从IEnumerator
的实现返回的相同值/引用的松散类型副本。所以在大多数情况下,只需返回this.Current
,不用担心:)
(仅供参考-返回this.Current也是一种很好的做法,因为它遵循DRY和SRP-让Current的强类型版本处理Current实际是什么的实现细节。)原因是
IEnumerator
继承IEnumerator
,因此当您从IEnumerator
继承时,您也隐式地从IEnumerator
继承。如果播发一个接口,即使您从未打算使用它,也应该为该接口提供一个实现。编译器要求您实现所有虚拟现实,因为它不可能知道在未知将来的某个点上,当某个意外程序集加载您的程序集时,将调用哪些虚拟现实。通过从接口继承,您正在“签署一份合同”,该合同承诺您将实现其所有成员。编译器要求您遵守该协议,以便其他程序集能够依赖它
接口特性的目的是使您的类能够在任何时间、任何地点告诉任何其他程序集,“这就是您可以要求我做的”。如果您想公布一个较小的功能,请定义一个只提供您想要的部分功能的新接口,并实现它
当然,所有这些都是工业实力的东西。这比你现在需要的代码要多。但是C#是用来做严肃的事情的,而不仅仅是玩具
至于两个不同的、几乎相同的覆盖:您必须覆盖两个当前属性,因为它们本质上是不同的:一个是泛型返回T;另一种是非泛型返回对象。您始终可以将字符串引用视为对对象的引用,但这并不是双向的。那么值类型呢?T不被限制为类。当然,编译器可以假设为您解决所有这些问题,并让您在二者可替换的情况下摆脱困境,但事实并非如此,我不相信它应该这样做。如果你想要C++,你知道在哪里找到它。 +1给出了在这种情况下如何调用IEnumerator.Current实现的示例。