C# 如何编写从接口到另一类型的隐式转换?

C# 如何编写从接口到另一类型的隐式转换?,c#,casting,implicit-conversion,C#,Casting,Implicit Conversion,我正在尝试做如下事情: public class SomeWrapper : ISomeWrapper{ public static implicit operator ActualRec(ISomeWrapper someWrapper) { return ((SomeWrapper)someWrapper).SomeInfo; } } 但这段代码失败了,它说: “参数或返回类型必须为SomeWrapper类型” 我理解编译所说明

我正在尝试做如下事情:

public class SomeWrapper : ISomeWrapper{

  public static implicit operator ActualRec(ISomeWrapper someWrapper)
        {
            return ((SomeWrapper)someWrapper).SomeInfo;
        }
}
但这段代码失败了,它说: “参数或返回类型必须为SomeWrapper类型”


我理解编译所说明的问题。但是我需要这种类型转换,因为在整个应用程序中,我使用ISomeWrapper作为变量,存储SomeWrapper实例。(另外,SomeWrapper是实现ISomeWrapper的唯一类)

是否有任何方法可以将包装器接口隐式转换为我在具体类中知道的类型

编辑: 正如所有人所建议的,在C#中,从接口隐式转换是不可能的

我需要这样做的原因是什么?我希望(隐式地)允许ISomeWrapper的用户调用需要ActualRec作为参数的方法,而不允许ISomeWrapper的用户调用ActualRec的方法/属性

比如说,, 如果我在ISomeWrapper中包含属性ActualRec,那么ISomeWrapper的用户将能够调用ActualRec中可用的方法(比如someWrapper.ActualRec.Dispose()),我不想公开这些方法

这就是为什么要尝试寻找一些隐式转换

另外,我不想在整个应用程序中使用SomeWrapper

请建议是否有一些概念/模式来完成这项工作

感谢您的关注。

C#不允许这样做,因为这样的功能很容易导致无法阅读的代码,让其他开发人员眼花缭乱。请尝试改用扩展方法:

public static class SomeWrapperExtensions
{
    public static ActualRec ToActualRec(
        this ISomeWrapper wrapper)
    {
        return ((SomeWrapper)someWrapper).SomeInfo;
    }
}
这允许您以其他开发人员无法采用的方式执行约定:

ActualRec rec = wrapper.ToActualRec();
请注意,这仍然很脆弱,因为您不知道
isomowrapper
是否实际表示
SomeWrapper
实现。阅读下面的内容

允许类或结构声明从源类型S到目标类型T的转换,前提是满足以下所有条件:

S和T都不是对象或接口类型

而且

用户定义的转换不允许从接口类型转换或转换为接口类型。 特别是,此限制确保不会发生用户定义的转换 转换为接口类型时,以及转换为接口类型成功 仅当正在转换的对象实际实现了指定的接口类型时


我想说你的设计有缺陷。您正在从接口转换为具体类型,这使得接口的使用毫无意义。接口是一个契约,通过该契约,实现类型将符合该契约,以提供所需的服务集。在您的示例中,
SomeInfo
属性是否未在接口(合同)中定义?如果没有,为什么要尝试使用接口强制转换?您应该使用
SomeWrapper
作为输入参数本身。

“SomeWrapper是唯一实现ISomeWrapper的类”——这是一个巨大的红旗,上面写着“这里有糟糕的代码味道”。如果只有一个类实现接口,那么接口有什么价值?只要在任何地方都使用这个类。@Eric:这不是毫无意义的,因为我使用这个接口进行单元测试。我同意你的看法。这个设计看起来不太好。请参阅我的问题描述中的编辑部分,我已经描述了采取这种方法的原因。我希望存在一种隐式转换形式,它只能在值被明确强制到目标类型的上下文中使用(例如,作为赋值,或作为第n个参数传递给其第n个参数不能接受任何其他内容的方法)。大多数涉及隐式转换到接口类型的令人眼花缭乱的情况都源于这样的情况:这种转换的存在将导致不明显的重载选择;这种行为几乎不限于接口。