public interface IInterface { }
public class MyClass { }
public static class Program {
public static void Main() {
IInterface myVariable = new MyClass();
}
}
我希望此代码能够正常运行,因为MyClass
确实满足IInterface
,但I get a compilation error:
错误CS0266:无法将类型“MyClass”隐式转换为“IInterface”。存在显式转换(您是否错过了演员?)
为什么?
我可以使用哪种解决方法不涉及显式转换?
答案 0 :(得分:5)
不幸的是,C#或.NET在这个特定的上下文中不支持duck typing。
对于实现特定接口的类型,它必须显式声明它实现了此接口。你说"满足"现在,但这对C#或.NET没有任何意义。
MyClass
类型是否实现IInterface
?不,遗憾的是它没有。
此声明:
public class MyClass { }
声明一个继承System.Object
的类,并且不实现任何接口。
接口不包含任何方法或属性这一事实不会使其与此类型匹配。该类仍然没有实现此接口。
类实现接口的唯一方法是使其显式化:
public class MyClass : IInterface { }
所以不,没有办法强迫C#或.NET将该类视为实现此接口的类。
处理此问题的常用方法是创建一个包装类(即实现IInterface
并包含MyClass
的类,将所有方法和/或属性委托给包含的MyClass
实例),或者,你知道,实际上实现了接口。
总而言之,编译此代码的唯一方法是:
IInterface myVariable = new MyClass();
是明确地使MyClass
实现接口:
class MyClass : IInterface { }
或从另一个实现它的类继承:
class BaseClass : IInterface { }
class MyClass : BaseClass { }