Duck输入不会隐式地将类型转换为接口变量

时间:2017-06-30 20:24:35

标签: c# c#-4.0 interface duck-typing

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”。存在显式转换(您是否错过了演员?)

为什么?

我可以使用哪种解决方法不涉及显式转换?

1 个答案:

答案 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 { }