IEnumerable.GetEnumerator()和IEnumerable <T> .GetEnumerator()

Mou*_*Lin 5 .net ienumerable inheritance

在.net框架中,有一个IEnumerable<T>继承自非泛型的通用接口IEnumerable,它们都有一个GetEnumerator()方法.这两者之间的唯一区别GetEnumerator()是返回类型.现在我有类似的设计,但是当我编译代码时,编译器说:

MyInterface<T>.GetItem()'隐藏继承成员' MyInterface.GetItem()'.如果要隐藏,请使用new关键字.

所述MyInterface<T>.GetItem()返回一个具体类型T,而MyInterface.GetItem()返回System.Object类型.

所以我认为如果BCL团队成员编译.net框架,他们会得到同样的警告.

我认为编译器警告不好,你怎么看?我该如何解决这个问题?我的意思是我想在调用MyInterface<T>.GetItem()不仅仅是System.Object类型的实例时得到具体类型T.

提前致谢!:-)

补充: 我说接口是自己的:IMyInterface 继承自 IMyInterface,它们都有GetItem()方法(IMyInterface.GetItem()返回类型T,而IMyInterface.GetItem()返回类型System.Object).问题是,如果我们的代码只有这两个接口,即没有派生的具体类,我们将在编译源代码后遇到编译器警告.

Dav*_*ton 10

它们不是因为它们将一个版本编译为显式接口方法实现.它看起来像这样:

public class SomeClassThatIsIEnumerable<T> : IEnumerable<T>
{
    public IEnumerator<T> GetEnumerator()
    {
       // return enumerator.
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return ((IEnumerable<T>)this).GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

这种类型的构造所做的是使第一个GetEnumerator方法成为默认方法,而另一个GetEnumerator方法只有在调用者首次将SomeClassThatIsIEnumerable转换为IEnumerator类型时才可访问,因此它避免了这个问题.

编辑:根据上面的补充,你会想要使用新的关键字:

public interface IMyInterface
{
   object GetObject();
}

public interface IMyInterface<T> : IMyInterface
{
   new T GetObject();
}

// implementation:

public class MyClass : IMyInterface<string>
{
    public string GetObject() 
    {
        return "howdy!";
    }

    object IMyInterface.GetObject()
    {
        return GetObject();
    }
}
Run Code Online (Sandbox Code Playgroud)