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
答案 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。