我正在尝试做如下的事情:
public class SomeWrapper : ISomeWrapper{
public static implicit operator ActualRec(ISomeWrapper someWrapper)
{
return ((SomeWrapper)someWrapper).SomeInfo;
}
}
但是这段代码失败了,说: “参数或返回类型必须是 SomeWrapper 类型。
我理解编译所陈述的问题。但我需要这种类型转换,因为在我的应用程序中,我使用 ISomeWrapper 作为变量,存储 SomeWrapper 实例。 (此外,SomeWrapper 是唯一实现 ISomeWrapper 的类)。
如果 ISomeWrapper 接口与我在具体类中知道的类型有什么方法可以进行隐式转换吗?
编辑: 正如大家所建议的,在 C# 中不可能从接口进行隐式转换。
我需要这样做的原因是什么?我想(隐式)允许 ISomeWrapper 的用户调用需要 ActualRec 作为参数的方法,而不授予 ISomeWrapper 的用户调用 ActualRec 的方法/属性的访问权限。
例如, 如果我在 ISomeWrapper 中包含一个属性 ActualRec,那么 ISomeWrapper 的用户将能够调用 ActualRec 中可用的方法(比如 someWrapper.ActualRec.Dispose() ),我不想公开这些方法。
这就是尝试寻找隐式转换的原因。
另外,我不想跨应用程序使用 SomeWrapper。
请建议是否有一些概念/模式可以完成此任务。
感谢您的关注。
这在 C# 中受到限制。请阅读下文。
如果满足以下所有条件,则允许类或结构声明从源类型 S 到目标类型 T 的转换:
...
S 和 T 都不是对象或接口类型。
还有,
用户定义的转换不允许与接口类型相互转换。 特别是,此限制可确保不会发生用户定义的转换 当转换为接口类型时,并且转换为接口类型成功 仅当被转换的对象实际实现指定的接口类型时。
我想说你的设计有缺陷。 您从接口转换为具体类型,这使得接口的使用变得毫无意义。接口是一个契约,通过它实现类型将符合提供一组所需的服务。在您的示例中,接口(合约)中是否未定义
SomeInfo
属性?如果没有,你为什么要尝试使用界面进行转换?您应该使用 SomeWrapper
作为输入参数本身。
C# 不允许这样做,因为这样的功能很容易导致代码不可读,让其他开发人员眼花缭乱。尝试使用扩展方法:
public static class SomeWrapperExtensions
{
public static ActualRec ToActualRec(
this ISomeWrapper wrapper)
{
return ((SomeWrapper)someWrapper).SomeInfo;
}
}
这允许您以一种不会让其他开发人员感到惊讶的方式进行约定:
ActualRec rec = wrapper.ToActualRec();
请注意,这仍然很脆弱,因为您不知道
ISomeWrapper
是否实际上代表 SomeWrapper
实现。