Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在实现IEnumerator的类中需要IEnumerator.Current<;T>;?_C#_.net_Ienumerator - Fatal编程技术网

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实现的示例。