无法隐式转换接口类型

时间:2015-11-07 20:24:32

标签: c#

stackoverflow中有一些类似线程的重复,但这不完全相同,所以我再次在这里发布。让我们考虑以下示例。

  public interface ILeft
    {
        void Move();
    }

    public class MoveableOject : ILeft
    {
        //without public we get an error
        public void Move()
        {
            Console.WriteLine("Left moving");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MoveableOject mo = new MoveableOject();
            mo.Move();
            Console.ReadKey();
        }
    }

一切都很好。现在让我们考虑ILeft的显式实现。为什么注释行会给出上述错误消息?

 class MoveableOject : ILeft
{
    void ILeft.Move()
    {
        Console.WriteLine("Left moving");
    }
}

class Program
{
    static void Main(string[] args)
    {
        MoveableOject mo = new MoveableOject();
       // MoveableOject moWithErrorObject = (ILeft) new MoveableOject(); <--
        ((ILeft)mo).Move();
        ((ILeft)new MoveableOject()).Move();

        Console.ReadKey();
    }
}

编辑:2015年11月8日错误陈述中的MoveableOject应该是可以理解的,错误的是我把它放在那里。为什么我发布它无法解释它的原因,让我们使用该对象并以下列方式传递给方法。

public static void ExpectDerivedPassedDerived(MoveableOject passedObject)
{
    passedObject.Move();
}

现在,如果我从Main调用该方法,它应该有效吗?但它并不是因为我有明确的实现,但如果我使用public关键字实现,那么这很好,我正在寻找对此的解释。

 ExpectDerivedPassedDerived(mo);  //mo is MoveableOject type

2 个答案:

答案 0 :(得分:2)

您创建一个新的MoveableOject,将其强制转换为ILeft,然后尝试将您从强制转换的ILeft分配给MoveableObject引用。正如预期的那样,Compliler不同意

Ileft iLeftReference = getILeft();
MoveableOject mObj = iLeftReference; // same error

答案 1 :(得分:2)

您正在观察的错误与ILeft的显式实现无关。实际上这是因为assignment compatibility。 我们只能将更多派生对象分配给较少派生的对象,反之亦然。

你做不到:

MoveableOject moWithErrorObject = (ILeft) new MoveableOject();

由于MoveableOject比其父ILeft派生的更多。

您可以获得一些详细信息here