C#方法的完全限定名称是什么?

时间:2008-12-21 10:26:12

标签: c# generics

在任何课程中,我如何明确地引用我班级的某种方法?

例如,此代码有效:

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()

编辑:我对“为什么”这种方式不起作用不感兴趣。我只是在寻找一种方法来做到这一点。感谢。

2 个答案:

答案 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()一样 - 它让消费者更容易知道它在那里。我不认为所有接口实现都应该公开(远非如此),但foreachusing是如此基本,以至于一点点广告不会受到伤害。