在任何课程中,我如何明确地引用我班级的某种方法?
例如,此代码有效:
class Test : IEnumerable<T> {
public IEnumerator<T> GetEnumerator() { return null; }
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
}
但是这个没有!
class Test : IEnumerable<T> {
IEnumerator<T> IEnumerable<T>.GetEnumerator() { return null; }
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } // error
}
如何参考我的方法的通用版本?在Java中,我只是在其前面添加接口名称,但这似乎不适用于C#。有没有办法做到这一点,除了((IEnumerable<T>)this).GetEnumerator()
?
编辑:我对“为什么”这种方式不起作用不感兴趣。我只是在寻找一种方法来做到这一点。感谢。
答案 0 :(得分:3)
如果使用显式接口实现,则需要通过该接口访问该方法。
所以不,除了你在案文中提出的建议外别无他法。
在这种情况下,您通常不会对通用接口使用显式实现。
修改:如果文档警告是您关注的来源,请告诉我更好的建议:GhostDoc。
如果你安装它,并将其绑定到Shift + Ctrl + D(默认),那么它将尝试理解你的方法的名称并添加必要的文档。这不是很好的部分,因为您应该自己编辑此部分,但如果从基类继承方法和属性,或者在您的情况下继承,则它将自动复制文档。有时您需要对其进行编辑以使其更适合您的类型,但通常您可以保留它。
它还会对特殊模式进行特殊检测。
尝试一下,我相信你一定会喜欢它。
答案 1 :(得分:1)
嗯,你可以施展......
IEnumerator<T> IEnumerable<T>.GetEnumerator() { return null; } // TODO
IEnumerator IEnumerable.GetEnumerator() {
return ((IEnumerable<T>)this).GetEnumerator();
}
或者您可以对两者使用非公共实例方法:
IEnumerator<T> IEnumerable<T>.GetEnumerator() { return GetEnumerator(); }
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
private IEnumerator<T> GetEnumerator() { return null; } // TODO
就个人而言,我更喜欢看到一个公共的GetEnumerator() - 就像我喜欢公开的Dispose()一样 - 它让消费者更容易知道它在那里。我不认为所有接口实现都应该公开(远非如此),但foreach
和using
是如此基本,以至于一点点广告不会受到伤害。