简介
我知道“不允许用户定义的与基类的转换”。MSDN 对此规则的解释是: “您不需要这个操作符。”
我确实明白,用户定义的转换 到基类是不需要的,因为这显然是隐式的。但是,我确实需要一个转换 来自一个基类。
在我当前的设计(非托管代码的包装器)中,我使用存储在 Entity 类中的指针。 所有使用指针的类都从该 Entity 类派生,例如 Body 类。
因此,我有:
方法 A
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 # 不够信任我,不能使用他们的强制转换系统编写我自己的基础到子系统的转换。