介绍
我知道“不允许在用户定义的基础类之间进行转换”。作为对此规则的解释,MSDN给出了“您不需要此运算符”。
我确实知道不需要用户定义的向基类的转换,因为这显然是隐式完成的。但是,我确实需要从基类进行转换。
在我当前的设计中,使用非托管代码的包装程序,我使用存储在Entity类中的指针。所有使用指针的类都从该Entity类派生,例如,Body类。
因此,我有:
方法一
class Entity
{
IntPtr Pointer;
Entity(IntPtr pointer)
{
this.Pointer = pointer;
}
}
class Body : Entity
{
Body(IntPtr pointer) : base(pointer) { }
explicit operator Body(Entity e)
{
return new Body(e.Pointer);
}
}
此演员表是非法的。(请注意,我没有费心编写访问器)。没有它,编译器将允许我执行以下操作:
方法B
(Body)myEntity
...
但是,在运行时,我会得到一个例外,说明此强制转换是不可能的。
结论
因此,在这里,我需要从基类进行用户定义的转换,而C#拒绝了它。使用方法A,编译器会抱怨,但是代码将在运行时逻辑上起作用。使用方法B,编译器不会抱怨,但是代码显然会在运行时失败。
在这种情况下,我感到奇怪的是,MSDN告诉我不需要此运算符,并且编译器的行为好像是隐式的(方法B)。我应该做些什么?
我知道我可以使用:
解决方案A
class Body : Entity
{
Body(IntPtr pointer) : base(pointer) { }
static Body FromEntity(Entity e)
{
return new Body(e.Pointer);
}
}
解决方案B
class Body : Entity
{
Body(IntPtr pointer) : base(pointer) { }
Body(Entity e) : base(e.Pointer) { }
}
解决方案C
class Entity
{
IntPtr Pointer;
Entity(IntPtr pointer)
{
this.Pointer = pointer;
}
Body ToBody()
{
return new Body(this.Pointer);
}
}
但老实说,所有这些语法都是可怕的,实际上应该强制转换。那么,有什么方法可以使演员阵容发挥作用?是C#设计缺陷还是我错过了可能性?好像C#对我的信任不足,无法使用他们的演员表系统编写我自己的基数转换。