1

举个简单的例子:

interface IVehicle {
}

class Car : IVehicle {
}

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

IVehicle vehicle = new Car();

事实上,如果我像上面那样创建这些基类,我不会收到任何编译错误(并且代码会运行。)

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

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

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

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

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

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

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

ISimpleInterface simple = new SimpleImplementation();
IComplexInterface complex = new ComplexImplementation();

以上导致第二行出现编译时错误(表明它无法进行隐式转换)。

4

3 回答 3

8

您要么有两种类型,要么有两种IComplexInterface ComplexImplementation不同命名空间中命名的类型。

删除using 语句并使用类型的完整限定符,看看它是否解决了问题。导航到实现类仔细检查,以便它实现与您分配的相同接口。注意接口和类所在的命名空间。

于 2012-04-14T08:50:27.833 回答
2

间接接口实例化是正常的。正如您在问题中为简洁而定义的那样,该示例将编译并运行。

public interface ICar{}
public class Viper : ICar{}

ICar fun = new Viper();

非常基本的东西,虽然通常这会被包装在某种工厂模式中。无论哪种方式,该过程都很常见,因此问题必须出在您的实施中。

于 2012-04-13T20:45:59.447 回答
2

找出是什么原因造成的。此接口用作 WCF 服务合同。Svcutil 显然是在全局命名空间中创建接口的副本。由于它们位于不同的命名空间中,因此没有编译错误。关于错误指示两个不同名称(一个带有命名空间,一个没有命名空间)的部分表明这是导致它的原因。

于 2012-04-16T15:21:37.117 回答