C# 中从类型到接口的隐式转换 - 基本示例有效,但实际实现存在编译时错误
本文关键字:有效 编译时错误 存在 实现 类型 接口 转换 | 更新日期: 2023-09-27 18:31:15
举以下简单的例子:
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();
上述情况会导致第二行出现编译时错误(指示它无法进行隐式转换)。
命名空间中,您有两种名为 IComplexInterface
的类型或名为 ComplexImplementation
的两种类型。
删除 using 语句并对类型使用完整限定符,看看它是否能解决问题。导航到实现类仔细检查,以便它实现与您分配的接口相同的接口。仔细注意接口和类所在的命名空间。
间接接口实例化是正常的。为简洁起见,您的问题中定义的示例将编译并运行。
public interface ICar{}
public class Viper : ICar{}
ICar fun = new Viper();
非常基本的东西,尽管通常这将被包装在某种工厂模式中。无论哪种方式,该过程都很常见,因此问题必须出在您的实现中。
导致它的原因。此接口用作 WCF 服务协定。Svcutil 显然正在全局命名空间中创建接口的副本。由于它们位于不同的命名空间中,因此没有编译错误。关于指示两个不同名称(一个带有命名空间,一个没有)的错误部分表明这是导致它的指标。