Duck typing 不会隐式地将类型转换为接口变量
Duck typing doesn't implicitly convert a type to an interface variable
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:
error CS0266: Cannot implicitly convert type `MyClass' to `IInterface'. An explicit conversion exists (are you missing a cast?)
为什么?
有没有我可以使用的不涉及显式转换的解决方法?
遗憾的是,C# 或 .NET 在此特定上下文中不支持鸭子类型。
对于实现特定接口的类型,它必须显式声明它实现了这个接口。你现在说 "satisfy",但这对 C# 或 .NET 没有任何意义。
类型 MyClass
是否实现了 IInterface
?不,遗憾的是它没有。
此声明:
public class MyClass { }
声明一个继承System.Object
的class,不实现任何接口。
接口不包含任何方法或属性这一事实并不以任何方式使其与此类型相匹配。 class仍然没有实现这个接口。
class 实现接口的唯一方法是使其显式化:
public class MyClass : IInterface { }
所以不,没有办法强制 C# 或 .NET 将 class 视为实现此接口的一个。
处理这个问题的常用方法是制作一个包装器 class(即实现 IInterface
并包含 MyClass
的 class,委托所有方法 and/or 属性到包含的 MyClass
实例),或者,你知道,实际上 实现接口。
总而言之,编译此代码的唯一方法:
IInterface myVariable = new MyClass();
是让MyClass
显式实现接口:
class MyClass : IInterface { }
或从另一个实现它的 class 继承:
class BaseClass : IInterface { }
class MyClass : BaseClass { }
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:
error CS0266: Cannot implicitly convert type `MyClass' to `IInterface'. An explicit conversion exists (are you missing a cast?)
为什么?
有没有我可以使用的不涉及显式转换的解决方法?
遗憾的是,C# 或 .NET 在此特定上下文中不支持鸭子类型。
对于实现特定接口的类型,它必须显式声明它实现了这个接口。你现在说 "satisfy",但这对 C# 或 .NET 没有任何意义。
类型 MyClass
是否实现了 IInterface
?不,遗憾的是它没有。
此声明:
public class MyClass { }
声明一个继承System.Object
的class,不实现任何接口。
接口不包含任何方法或属性这一事实并不以任何方式使其与此类型相匹配。 class仍然没有实现这个接口。
class 实现接口的唯一方法是使其显式化:
public class MyClass : IInterface { }
所以不,没有办法强制 C# 或 .NET 将 class 视为实现此接口的一个。
处理这个问题的常用方法是制作一个包装器 class(即实现 IInterface
并包含 MyClass
的 class,委托所有方法 and/or 属性到包含的 MyClass
实例),或者,你知道,实际上 实现接口。
总而言之,编译此代码的唯一方法:
IInterface myVariable = new MyClass();
是让MyClass
显式实现接口:
class MyClass : IInterface { }
或从另一个实现它的 class 继承:
class BaseClass : IInterface { }
class MyClass : BaseClass { }