【问题标题】:Casting an implementation of Interface B to and implementation of Interface A将接口 B 的实现转换为接口 A 的实现
【发布时间】:2019-07-26 22:21:33
【问题描述】:

我正在尝试让以下代码运行。我想将 A 类的对象转换为 B 类的对象,但出现错误。理论上,A 是 B 的一部分,所以我看不出,为什么这不起作用。

我知道,这个演员表确实意味着丢失一些数据,但这正是我想要的。 有没有办法让它运行?

public class Program
{
    public static void Main()
    {
        var b = new B();
        var a = (A)b; //Error: Cannot convert type
    }
}

public interface IA{}

public interface IB : IA{}

public class A : IA{}

public class B : IB{}

【问题讨论】:

  • IAB 的一部分,而不是 A。改为var a = (IA)b;
  • 仅供参考:“我知道,这个演员表确实意味着丢失一些数据”。对于引用类型(即对象;not 值类型,如 intfloat 等),强制转换通常不会导致数据。例外的是实现(显式/隐式)转换运算符的类,其自定义实现会导致“数据丢失”(可以这么说)......

标签: c# types interface casting type-conversion


【解决方案1】:

显然,B 不属于 A 类型,反之亦然:

不可能将 B 转换为 A。您只能转换为 IB 或 IA 类型。

【讨论】:

    【解决方案2】:

    您可以通过多种方式解决这个问题,一种是 Gilad Green 在他的回答中所说的方式,或者也可以实现一种转换方法:

            public static implicit operator A(B b)
            {
                //your code to convert from B to A
            }
    
            public static implicit operator B(A a)
            {
                //your code to convert from A to B
            }
    

    由于 B 实现了 IA 和 IB,因此除非您在此答案中实现类似代码 sn-p 之类的东西,否则您不能直接相互转换。

    【讨论】:

    • 嗯,是的,这是可能的。但我认为这更像是一种高级编程技术,而不是对象继承方面的课程。
    • 我无法反驳,Alpha75 在他的回答中基本上很好地展示了他为什么不能从一个转换到另一个的问题,我只是提供了(一种更高级的)方法来获得他所要求的可编程性:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2019-05-08
    • 2019-07-31
    相关资源
    最近更新 更多