object.Object.Monitor优先于自己的Monitor类

时间:2014-04-23 14:10:06

标签: d

我正在用D2编写一个渲染系统,但是我真的很烦我D喜欢它自己的监视器类object.Object.Monitor(顺便说一下我从未导入过)在我自己的Monitor类上。

什么方法可以防止D使用其监听类而不是我的?我知道我可以附加传统的下划线,或者只是使用它的全名(myapp.graphics.x11.Monitor)但是这个类会被大量使用,所以这些修复并不是很理想。

module app;

class Monitor {
    public Monitor returnMe() {
        return this; // Error: cannot implicitly convert expression (this) of type app.Monitor to object.Object.Monitor
    }
}


void main() {
    Monitor monitor = new Monitor;
    monitor.returnMe();
}

1 个答案:

答案 0 :(得分:3)

我认为这是因为在类Monitor中,你的类名还不存在,所以编译器认为已经存在的Monitor(它在object.d中是自动导入的)是一个更好的匹配。

我实际上认为这应该被认为是编译器错误,因为如果其他Monitor不存在,那么这段代码确实会起作用。编辑:实际上,由于Monitor是Object中的嵌套类,这是/不是/编译器错误,嵌套名称总是覆盖外部名称。所以Object基类有一个名为Monitor的嵌套类,这简直太奇怪了。 /编辑

但是要解决这个问题,你可以在Monitor类中使用typeof(this)而不是名称。这将消除内部歧义,外部代码仍然可以正常工作:

module app;

class Monitor {
     // changed the name only inside the class
    public typeof(this) returnMe() {
        return this;
    }
}


void main() {
     // works normally here
    Monitor monitor = new Monitor;
    monitor.returnMe();
}