C#中从类型到接口的隐式转换 - 基本示例有效,但实际实现有编译时错误

Jor*_*oom 1 c# implementation interface

采用以下简单示例:

interface IVehicle {
}

class Car : IVehicle {
}
Run Code Online (Sandbox Code Playgroud)

现在我应该能够做到以下几点:

IVehicle vehicle = new Car();
Run Code Online (Sandbox Code Playgroud)

事实上,如果我如上所述创建这些基类,我不会收到任何编译错误(代码运行.)

但是在我的项目中,无论我在做什么,基本上都是这样的(据我所知),我得到以下错误:

Cannot implicitly convert type 'Namespace.Path.Car' to 'IVehicle'. An explicit conversion exists (are you missing a cast?)
Run Code Online (Sandbox Code Playgroud)

有时(如在不同的代码位置,不是不同的编译),显式转换有效,有时它会编译,但会创建运行时异常(无效转换).为什么基本示例没有问题,而更详细的类(但仍然是直接实现接口的单个​​类)具有所有这些问题?

在某些情况下,它实际上会出现这个编译时错误:

Cannot implicitly convert type 'Namespace.Path.IVehicle' to 'IVehicle'. An explicit conversion exists (are you missing a cast?)
Run Code Online (Sandbox Code Playgroud)

我想我错过了这个隐式转换工作所需的一些重要条件,但是我没有发现什么区别导致简单的例子工作,更详细的类失败如此奇怪.我唯一注意到的是编译时错误只包括第一种类型的命名空间(如上面两个错误所示),但我不记得这是否正常.

为了消除任何环境原因,我使用以下代码创建了一个测试用例:

ISimpleInterface simple = new SimpleImplementation();
IComplexInterface complex = new ComplexImplementation();
Run Code Online (Sandbox Code Playgroud)

上面导致第二行的编译时错误(表明它不能进行隐式转换).

vid*_*ige 8

您有两种类型的命名IComplexInterface 两种ComplexImplementation在不同命名空间中命名的类型.

删除using语句并对类型使用完整限定符,并查看它是否可以解决问题.导航到实现类的双重检查,以便它实现与分配的相同的接口.请特别注意接口和类所在的命名空间.