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

Kin*_*any 0 c# duck-typing interface c#-4.0

public interface IInterface { }

public class MyClass { }

public static class Program {
    public static void Main() {
        IInterface myVariable = new MyClass();
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这个代码,因为工作MyClass确实满足IInterface,但我得到一个编译错误:

错误CS0266:无法将类型"MyClass"隐式转换为"IInterface".存在显式转换(您是否错过了演员?)

为什么?

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

ang*_*son 5

不幸的是,C#或.NET在这个特定的上下文中不支持duck typing.

对于实现特定接口的类型,它必须显式声明它实现此接口.你现在说"满足",但这对C#或.NET没有任何意义.

该类型是否MyClass实现IInterface?不,遗憾的是没有.

本声明:

public class MyClass { }
Run Code Online (Sandbox Code Playgroud)

声明一个继承的类System.Object,并且不实现任何接口.

接口不包含任何方法或属性的事实不会以任何方式使其与此类型匹配.该类仍然没有实现此接口.

类实现接口的唯一方法是使其显式化:

public class MyClass : IInterface { }
Run Code Online (Sandbox Code Playgroud)

所以不,没有办法强迫C#或.NET将该类视为实现此接口的类.

处理此问题的常用方法是创建一个包装类(即实现IInterface并包含一个类MyClass,将所有方法和/或属性委托给包含的MyClass实例),或者,您知道,实际实现了该接口.

总而言之,编译此代码的唯一方法是:

IInterface myVariable = new MyClass();
Run Code Online (Sandbox Code Playgroud)

是MyClass明确地实现接口:

class MyClass : IInterface { }
Run Code Online (Sandbox Code Playgroud)

或者从另一个实现它的类继承:

class BaseClass : IInterface { }
class MyClass : BaseClass { }
Run Code Online (Sandbox Code Playgroud)

  • @ LasseV.Karlsen这是一个例子,它确实更像是一种"类型",更好的例子是你可以"等待"或"foreach",或查询表达式语法. (2认同)